Just Do IT!

Bcrypt를 통해 비밀번호 암호화하기 본문

개발 공부/Node.js

Bcrypt를 통해 비밀번호 암호화하기

MOON달 2024. 1. 10. 15:32
728x90

암호화란?

어떤 평문을 암호문으로 바꾸는 것이다.

반대로, 암호문을 평문으로 바꾸는 것은 복호화라고 한다.

 

암호화는 아주 기본적인 정보 보안 방법이다.

데이터 유출 자체를 막지는 못하지만, 어떤 정보를 담고 있는지 알지 못하게 하는 것이다.

 

 

 

 

 

암호화의 필요성

  • 유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장 하지 않는다.
  • DB가 해킹을 당하면 유저의 비밀번호도 그대로 노출 된다.
  • 외부 해킹이 아니더라도 내부 개발자나 인력이 유저들의 비밀번호를 볼 수 있다.
  • 유저의 비밀번호는 꼭 암호화 해서 저장 해야 한다.

 

 

 

 

 

 

Bycript란 무엇인가

단방향 암호화를 위해 만들어진 해시 함수 (복호화 불가능)
비밀번호 자체를 검증할 때 입력받은 값을 암호화해서 저장된 암호화된 값과 비교해서 검증할 수 있다

 

 

Hash

임의의 길이를 갖는 임의의 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수 = Hash 함수
함수의 결과물 = Hash 값

 

Salting

제 비밀번호 이외에 추가적으로 랜덤한 데이터 값을 더해 해시 값을 계산하는 방법
비밀번호의 복잡도를 키워 보안을 높이는 것

 

Key Stretching

단방향 해시 값을 계산한 뒤, 그 해시 값을 해시하고, 또 해시하는 반복 과정
기존 단방향 해시 알고리즘의 빠른 실행속도가 취약점이 됐던 것을 보안하기 위한 방법

 

 

 

 

 

 

 

Bcrypt 적용해보기 (예시)

1. 설치하기

npm install bcrypt --save

 

공식 홈페이지

https://www.npmjs.com/package/bcrypt

 

bcrypt

A bcrypt library for NodeJS.. Latest version: 5.1.1, last published: 5 months ago. Start using bcrypt in your project by running `npm i bcrypt`. There are 4287 other projects in the npm registry using bcrypt.

www.npmjs.com

 

 

2. 모듈 불러오기

const bcrypt = require('bcrypt')

import bcrypt from 'bcrypt'

 

3. 실제 적용한 코드 예

// User.js

const bcrypt = require("bcrypt");
const saltRounds = 10;

...

userSchema.pre("save", function (next) {
  var user = this; // userSchema의 user

  // password 바꿀때만
  if (user.isModified("password")) {
    // 비밀번호 암호화시킨다
    // salt 생성
    bcrypt.genSalt(saltRounds, function (err, salt) {
      if (err) return next(err);

      // user.password = 입력한 user의 비밀번호
      bcrypt.hash(user.password, salt, function (err, hash) {
        // hash = 암호화된 비밀번호
        if (err) return next(err);

        user.password = hash; // hash된 비밀번호로 바꿔준다
        next();
      });
    });
  } else {
    next();
  }
});
// user 정보를 저장하기 전에 진행

// 로그인 시 비밀번호와 일치하는지 확인
userSchema.methods.comparePassword = function (plainPassword, cb) {
  // plainpassword 와 암호화된 비밀번호 일치 확인
  bcrypt.compare(plainPassword, this.password, function (err, isMatch) {
    if (err) return cb(err), cb(null, isMatch);
  });
};

..

 

 

 

 

 

 

 

 


강의를 듣다가 새로운 개념들을 공부하는 중인데, bcrypt는 보안 관련해서 스쳐지나갔던(ㅋㅋ) 단어였다.

실제로 예시를 따라쳐보고 구글링해서 찾아보는데, 단순히 firebase와 연동하면서 적용했던 로그인과 회원가입 기능에 대해 조금 더 깊게 알게 되는 것 같아서 나름 뿌듯하다...ㅎ

'개발 공부 > Node.js' 카테고리의 다른 글

Node.js에서 JWT(JSON Web Token) 활용하기  (0) 2024.01.10
mongoose 사용하기  (1) 2024.01.05
NodeJS와 express 알아보기  (1) 2024.01.02