My Dream Being Visualized

유저 비밀번호 암호화 (feat. bcryptjs) 본문

Backend/NestJS

유저 비밀번호 암호화 (feat. bcryptjs)

마틴킴 2021. 11. 6. 23:35
728x90

 개인 공부를 위한 공간입니다. 틀린 부분 지적해주시면 감사하겠습니다 (_ _)

 

coindeskkorea.com

곧 런칭 준비중인 프로그램을 미리 쓰고 계시는 직장동료가 물었다.

"회원가입하면, 제 비밀번호도 알 수 있어요?"

 

처음 회원가입 및 로그인 기능을 만들 때, 당연히 암호화를 해야 된다고 봐왔고

그렇게 했지만, 마음만 먹으면 몰래 저장하고 볼 수 있다는 생각이 머리를 스쳤다.

평범한 사람이 되거나, 나쁜 사람이 되는 건 한끗 차이인 것 같다.

 

"클라이언트에서 요청이 SSL 인증서를 타고 https화 되서 서버에서 해쉬 알고리즘을 거쳐서 데이터베이스에 저장돼요." 라고 말하면 앞으로 아무 질문도 안 할것 같아서

"암호화 되서 뭔지 저도 알 수가 없어요!"

라고 간단하게 말씀드렸다.

 

다시 한번 회원가입 및 로그인 서비스를 만드는 토이프로젝트를 하며, 암호화에 대해서 아주 간단하게 정리해보려고 한다. 서두가 너무 길었다..

 

빠르게, 보안도 신경썼다는 티를 내면서 구현하기 위해서 bcrypt  사용할 것이다.

 

npm install bcryptjs --save
  • 우리가 사용할 모듈을 설치한다.
// password를 할당 받았다고 가정하자.
// const password = '12345'

const salts = await bcrypt.genSalt();
const hashedPassword = await bcrpyt.hash(password, salts);
  • genSalt() 비동기 함수
    • 예를들어, 유저 비밀번호를 암호화 함에 특정 알고리즘만으로 암호화한다면 복호화가 가능하다.
    • 그렇다면, 암호화시 서버키를 넣는다면? 서버키를 도난당하면 무용지물..
    • 그럼 양방향 암호화가 아닌 단방향 암호화만 할 수 있는 알고리즘을 쓴다면? 레인보우 테이블이라고 유저들이 비슷한 암호를 사용한다고 가정하여 나름의 딕셔너리를 만드는거다.. 그래서 보안상 좋지 않음.
    • 그리하여, 솔트 + 비밀번호를 해시로 암호화하는 방법론이 나오게 되었다! 그 때 필요한 salt를 추출하는 함수가 genSalt()! default는 10이다. (높으면 높을 수록 salt를 generating하는데 오래걸림) > 특정 문자열을 추출
  • hash(비밀번호, 솔트) 비동기 함수
    • 비밀번호와 솔트를 활용하여 비밀번호를 암호화 한다.
    • 암호화된 비밀번호는, 솔트 정보와 비밀번호 정보가 같이 담겨있다. (로그인 시 compare(비밀번호, 해쉬비밀번호)로 활용)

'Backend > NestJS' 카테고리의 다른 글

NestJS 새로운 모듈 추가 (feat. auth)  (0) 2021.11.06
TypeORM 이란?  (0) 2021.11.06
NestJS 프로젝트 시작 전 설정  (0) 2021.10.30
NestJS에 대하여  (0) 2021.10.30