728x90
배경
회원가입 시 입력한 비밀번호가 그대로 데이터베이스에 저장되면, 데이터베이스 접속 정보가 노출이 되거나 유저 정보 유출 시 보안적으로 위험할 수 있다.
요구사항
1. 회원가입 시 비밀번호 암호화하기
2. 로그인 시 비밀번호 비교하여 로그인 성공하면 jwt 토큰 생성 및 발급하기
해결
Bcrypt는 레인보우 테이블 공격 방지를 위해 솔트(Salt)를 통합한 적응형 함수 중 하나이다. SHA 종류의 암호화는 GPU 연산에 유리한 32비트 논리 및 연산만 사용하기 때문에 GPU 연산을 이용한 공격에 취약하다. 그래서 Bcrypt 설계자는 Blowfish를 이용해 구현해서 이를 방지했다고 한다.
레인보우 테이블 : 해시 함수를 사용하여 변환 가능한 모든 해시 값을 저장시켜 놓은 표
솔트 : 데이터, 비밀번호, 통과암호를 해시 처리하는 단방향 함수의 추가 입력으로 사용되는 랜덤 데이터
1. bcrypt 설치하기
npm install bcrypt
2. 회원가입 시 비밀번호를 암호화하여 데이터베이스에 저장하고, 로그인 시 compare 함수를 통해 비교하여 일치하면 JWT 토큰을 반환한다.
// 회원가입 시 암호화
const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(user.password, salt);
const res = await prisma.user.findUnique({
where: {
emailLogin: user.emailLogin,
},
});
if (res) {
// 로그인 시 compare로 검증
const validPassword = await bcrypt.compare(user.password, res.password);
if (validPassword) {
const token: string = await this.generateAccessToken(res.id);
return {
id: res.id,
token: token,
};
}
}
3. 비밀번호가 다음과 같이 암호화되어 PostgreSQL 데이터베이스에 저장된다.
$2b$10$bERtp1Cwu1vQ1gaNKqU1ZuIHxZWhv1VVdpdSO2C1ART9liNUke.im
4. 로그인 성공 시 다음과 같이 token을 반환한다.
{
"code": 200,
"msg": "",
"data": {
"id": 9,
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6OSwiaWF0IjoxNjY3OTMwMjY5LCJleHAiOjE2NjgwMTY2Njl9.h-7y14VhLKk7Lcb6NYNJBprdbMvBzle9L8cVLuItx8Q"
}
}
Next To Do
1. 카카오, 페이스북, 애플 로그인과 회원가입 분기 처리하기
'개발 > Node.js' 카테고리의 다른 글
SQL :: 점수 합계, 등급 산정하기, PERCENTRANK, SUM (8) | 2023.01.26 |
---|---|
Node.js + TypeScript + nodemailer :: 이메일 인증번호 보내기 (0) | 2022.11.08 |
Prisma + PostgreSQL :: 차세대 Node.js, TypeScript ORM 기술 (0) | 2022.11.06 |