6. boilerplate - 보안 파일 with ENV file
IT/프로젝트

6. boilerplate - 보안 파일 with ENV file

반응형

boilerplate 유튜브 강의 시리즈

Blog ReactJS NodeJS#10 SECURE PRIVATE INFO with ENV file

 

몽고DB에 연결할 때 사용하는 사용자 비밀번호 같은 보안 정보는 따로 분리해서 가지고 있는 것이 좋다.

이번 강의에서는 config 폴더에 상용(prod), 개발(dev) 파일을 따로 만들었다.

dev 파일에는 secret 변수들이 직접 저장되고 prod에는 dev와 같은 변수들이 저장되지만 환경 변수로 불러온다.

마지막으로 key 파일을 만들어 환경변수인 NODE_ENV의 값이 production이면 prod에 담긴 내용을 가져오고 production이 아니면 dev에 담긴 내용을 가져온다.

 

이번 강의까지 진행된 프로젝트 구조이다.

config파일을 정의하기에 앞서

type 정의를 위한 @types폴더를 만들고 common 폴더안에 index.d.ts 파일을 생성했다.

 

index.d.ts 에 interface를 정의하고

interface Sequrity{
    mongoURI: string
}

tsconfig.json 에 typeRoots를 적어준다.

{
  "compilerOptions": {
    ...
    "typeRoots": ["./node_modules/@types", "./@types"],
    ...
   }
   ...
 }

 

이제 Sequrity 인터페이스를 프로젝트 내에서 사용할 수 있다.

 

1. dev.ts

const dev:Sequrity = {
    mongoURI: 'mongodb+srv://inseop:<password>@cluster0.v2bfu.mongodb.net/<dbname>?retryWrites=true&w=majority'
}

export default dev;

 

2. prod.ts

const prod:Sequrity = {
    mongoURI: process.env.MONGO_URI!
}

export default prod;

 

3. key.ts

import prod from './prod';
import dev from './dev';

let config:Sequrity;

if(process.env.NODE_ENV === 'production'){
    config = prod;
}else{
    config = dev;
}

export = config;

 

4. 절대 경로에 config 추가

 

tsconfig.json

{
  "compilerOptions": {
      ...
      "paths": { 
          "@model/*": ["model/*"],
          "@config/*": ["config/*"]
      },
      ...
  }
  ...
 }

package.json

  {
      ...
      "_moduleAliases": {
        "@model": "dist/model",
        "@config": "dist/config"
      },
      ...
  }

 

5. index.ts

기존에 index파일에서 uri 변수로 사용하던 몽고 DB connection string을 config 폴더로 옮겼기 때문에

import해서 config 정보를 가져온 후 몽고 DB에 connect할 때 config.mongoURI와 같이 사용하여 connection string 값을 가져오는 것으로 변경됐다.

import 'module-alias/register';
import express from 'express';
const app = express();
const port = 3000;
import mongoose from 'mongoose';
import cookieParser from 'cookie-parser';

// 추가된 부분
import config from '@config/key';

import {User, IUser} from '@model/user'

// 변경된 부분
mongoose.connect(config.mongoURI, { useCreateIndex: true, useNewUrlParser: true, useUnifiedTopology: true })
        .then(()=>console.log('DB connected'))
        .catch((err: Error)=>console.log(err));

app.use(express.json());
app.use(express.urlencoded({extended : true }));
app.use(cookieParser());

app.post('/api/users/register', (req: express.Request, res: express.Response)=>{
    const user: IUser = new User(req.body);
    
    user.save((err: Error, userData: IUser)=>{
        if(err) return res.json({success: false, err});
        return res.status(200).json({
            success:true
        });
    });
});

app.get('/', (req: express.Request, res: express.Response)=>{
    res.send('Hello World');
});

app.listen(port, ()=>{
    console.log(`app listening on port ${port}`);
})

 

반응형