2024.01.02(화)

🔌http-status-codes 모듈

  • status code hard coding ❌ → code의 의미를 알아보기 쉽게!
    이미 mapping 해놓은 모듈이 있으니 가져다 쓰면 됨 😃
  • npm i http-status-codes
  • 401(UNAUTHORIZED)과 403(FORBIDDEN) 차이
    HTTP CODE401(UNAUTHORIZED)403(FORBIDDEN)
    상황클라이언트가 인증되지 않았거나, 유효한 인증 정보가 부족하여 요청이 거부됨. 서버가 사용자를 모름.서버가 해당 요청을 이해했지만, 권한이 없어 요청이 거부됨. 서버가 사용자를 알고 있음.
    예시사용자가 로그인되지 않은 경우사용자가 권한이 없는 요청을 하는 경우

💡403 경우 "해당 요청에 대한 자원이 존재함"을 내포하고 있기 때문에 자원의 존재 자체를 숨기고 싶은 경우에는 404(Not Found)를 사용하는 것이 적합할 수 있음.

🔐crypto 모듈

  • Node.js 내장 모듈 🔗

    The node:crypto module provides cryptographic functionality that includes a set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign, and verify functions.

  • 회원가입 시, 사용자 비밀번호를 암호화 → 암호화된 비밀번호 & salt 값 DB에 저장
  • 로그인 시, 이메일 & 비밀번호 → salt 값 꺼내서 비밀번호 암호화해보고 DB 비밀번호와 비교
  • crypto를 활용하여 사용자가 입력한 password를 암호화하는 함수를 만들어 보았다.
    const crypto = require('crypto')
    require('dotenv').config();
    
    /**
     * @param {string} rawPassword
     * @param {string} salt - base64 encoded
     */
    const encryptPassword = (rawPassword, salt = null) => {
        if (!salt) {
            salt = crypto.randomBytes(parseInt(process.env.SALT_SIZE)).toString('base64');
        }
        const hashedPassword = crypto.pbkdf2Sync(
            rawPassword, salt, parseInt(process.env.ITERATIONS), parseInt(process.env.KEY_LEN), process.env.DIGEST
        ).toString('base64');
        return { salt, hashedPassword };
    };

🔒암호화 원리

암호화복호화암호화 방식
단방향OXHash
양방향OO대칭키(비공개키), 비대칭키(공개키)

사용자의 비밀번호는 본인만이 알 수 있어야하고, 만약 비밀번호를 잃어버린 경우 복호화하는 과정에서 노출되기 때문에 대부분 재설정을 할 수 있도록 함 ⇒ 단방향 암호화 방식을 사용!

  • 해시 알고리즘은 공개되어 있기 때문에 해커에게도 공개됨
    MD5, SHA-1, HAS-180과 같이 이미 보안이 뚫린 해시 함수가 존재. 절대 사용하면 안됨.
    보다 안전한 SHA-256, SHA-512 등을 사용하는 것이 권장됨.
  • Hash 알고리즘과 인코딩 방식을 사용할 때 같은 비밀번호에 대해서 동일한 해시 값을 반환함
    ⚠️ rainbow table(해시 함수를 사용하여 변환 가능한 모든 해시 값을 저장시켜 놓은 표)가 존재하기 때문에 위험함
  • 소금(salt)을 뿌려 해커가 복호화하는 것을 방해
    • random한 값(salt)을 생성해서 비밀번호와 함께 암호화하여 보완 (salt는 이후 검증을 위해 DB에 저장해야 함)
    • 같은 비밀번호라고 해도 해시 값이 다름!
  • salt와 비밀번호를 해시함수에 넣는 과정을 반복하는 Key Stretching 사용
    • 출력 값을 아주 느리게 산출되도록 해서 해커 귀찮게 하기
    • 계산량이 많다면 레인보우 테이블을 제작하는 데도 어마어마한 시간과 비용이 들어갈 것
    • 암호화 방법: pbkdf, scrypt, bcrypt
      • pbkdf보다 scrypt 방식이 더 안전하다고 함

🛡️ 안전한 parameter 값 설정하기

  • salt의 길이는 32byte 이상 & 각 비밀번호마다 고유한 salt 사용하기
  • iterations는 10000처럼 딱 떨어지는 수가 아닌 10376처럼 불규칙한 숫자 사용하기

✏️Code 수정

🕹️Controller

  • 기존 callback 함수들을 router에서 모두 정의했었는데 router는 routing의 역할 수행하도록 하기 위해 callback 함수들을 controller라는 폴더에 따로 모아 모듈화
  • roter에서는 각 controller에 정의되어 있는 callback 함수들을 import하여 사용

🎨Git Commit Message Convention

  • 기존 commit들을 git commit message convention에 맞게 commit type을 추가하여 수정하였다.
  • 수정 전
  • 수정 후
  • git rebase -i HEAD~6으로 기존 commit들을 모두 수정했다.
    • 수정하고 싶은 commit의 pickreword로 바꿔주면 차례대로 수정 가능
  • 변경한 commit들을 git push -f로 강제로 원격 저장소에 push해서 덮어씌웠다.
  • 대신 commit 시각이 rebase한 시각으로 변경되는 것 같다.
profile
이것저것 관심 많은 개발자👩‍💻

0개의 댓글