8-2 http-status-codes 모듈, controller, password

airbus·2025년 3월 14일

프로그래머스

목록 보기
34/93

8-2 http-status-codes 모듈, controller, password

HTTP-status-codes 모듈 링크

  • 요청에 대한 응답의 상태를 숫자로 표현하였던 것을 대신하여 문자를 사용하여 그 의미를 구체적으로 명시할 수 있는 모듈 입니다.

ex)

const { StatusCodes } = require('http-status-codes');

~

conn.query(sql, values,
        (err, results) => {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
            res.status(StatusCodes.CREATED).json(results);
        })
  • sql문 실행과, values값에 이상이 있는 경우 err 처리를 하면서, 클라이언트의 잘못된 요청res.status(400)를 대신하여 StatusCodes.BAD_REQEUST 처럼 작성하여 코드의 가독성과, 보수성을 높일 수 있습니다.

  • res.status(200)SatusCodes.CREATED로 작성


Controller

app.js : 프로젝트의 메인 라우터 역할
/routes
   /users.js : 하위 라우터 역할
   /books.js : 하위 라우터 역할
   ...

라우터가 로직(기능)까지 모두 수행할 때 단점

  • 프로젝트 규모가 커질수록, 코드가 매우 복잡해짐
  • 가독성 떨어짐
  • 트러블 슈팅 어려워짐
    ==> 유지 보수하기 어렵다 (= 야근 & 퇴근늦어짐)

해결방법

  • 경로를 찾아 콜백함수를 빼준다(분리).

요약없이 설명하면 : users.js에 라우터와 그 경로에 대한 기능까지 구현이 되어있는 것을, users.js는 라우팅만 해주고 각 경로에 대한 기능들은 UserContoller.js라는 별도의 파일을 만들어서 해당 파일에 기능을 구현한 뒤 모듈화 하여 users.js에 가져와서 콜백함수부분으로 연결해서 사용합니다.

= user.js의 콜백함수 부분을 UserController.js로 옮기고 모듈화, user.js에서 가져와서 사용

ex)

기존에 아래와 같이 users.js에서 login 경로에 대한 라우팅과 기능을 같이 구현 한 것을 
router.post('/login', (req, res) => {
    const { email, password } = req.body;

    let sql = 'SELECT  * FROM users WHERE email = ?';
  ~
  ~
}
  
==================
<users.js>
UserController.js에서 모듈화 하여 가져오고
const { join, login} = require('../controller/UserController')

/login 경로에 대한 것은 login 콜백함수로 대체
router.post('/login', login); 
  
그 login에 대한 기능은 UserContoller.js에서 구현

===================
<UserController.js>
const login = (req, res) => {
    const { email, password } = req.body;

    let sql = 'SELECT  * FROM users WHERE email = ?'; // 이메일 확인
    conn.query(sql, email,
        (err, results) => {
            if (err) {
                console.log(err);
                return res.status(StatusCodes.BAD_REQUEST).end();
            }
      ~
      ~
module.exports = { join, login } 

컨트롤러

  • 프로젝트에서 매니저 역할을 하는 파일
  • 누군가에게 일을 어떻게 시켜야할 지 알고있습니다. = 직접 일을 하진 않음
  • 라우터를 통해서 사용자의 요청이 길을(URI) 찾아오면
  • 매니저(콜백함수 = controller)가 환영 -> 알바생에게 일을 시킨다음, 결과물을 매니저에게 전달 -> 매니저가 사용자에게 res를 돌려줍니다.

비밀번호 암호화

crypto

  • node.js에서 기본적으로 제공하는(내장 모듈) 암호화 담당 모듈
const crypto = require('crypto')

const salt = crypto.randomBytes(64).toString('base64');
const hashPassword = crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('base64');

randomBytes(64)

  • 64 길이로 랜덤하게 바이트를 만듭니다.

toString('base64)

  • base64형식의 문자열로 변환합니다.

pbkdf2Sync

  • password : 입력한 비밀번호, 해싱할 값
  • salt : 랜덤한 데이터
  • 10000 (iteration) : 해싱 반복 횟수 (높을 수록 해킹어려움 & 연산시간 증가)
  • 64 (keylength) : 해시 값 길이 (byte)
  • 'sha512' : 암호화(해싱)에 사용될 해시 알고리즘

기타 : 왜 salt인가?

  • 비밀번호만 암호화 = 싱거운 요리 (예측 가능)
  • 비밀번호 + salt를 추가 후 해싱 = 간이 맞는 요리 (보안 강화)

기타 : 길이 조절은?

  • 해시길이는 randomBytes와 keylenth부분을 조절

사용
ex)

  • 암호화된 비밀번호와 salt값을 DB에 저장시켜두고, 로그인 할 때 salt값을 가져와 입력받은 비밀번호를 암호화 시킵니다.
  • 이후 해당 slat값으로 암호화한 비밀번호가 DB에 저장된 비밀번호와 일치한지 확인합니다.
  • 위와같은 이유로 DB에 입력되어있는 비밀번호가 암호화된 값이더라도 로그인이 되는 것입니다.

0개의 댓글