회원가입을 할 때 우리가 비밀번호를 그대로 database에 저장을 하게 되면 어떻게 될까요? database가 털리면 회원가입한 유저들의 정보들이 그대로 노출이 되는 불상하가 일어나는데요. 이 같은 일이 발생하지 않게 하는 게 바로 암호화입니다.
암호화는 node에서 제공하는 crypto라는 모듈, npm에서 설치해서 사용할수 있는 bcrypt라는 모듈이 존재합니다.
그렇다면 모듈을 이용하여 어떻게 비밀번호를 암호화 하는지 알아봅시다.
crypto
const salt = crypto.randomBytes(64).toString("base64");
const hashPassword = crypto
.pbkdf2Sync(password, salt, 10000, 64, "sha512")
.toString("base64");
bcrypt
const salt = bcrypt.genSaltSync(10);
const bashPw = bcrypt.hashSync(pw,salt);
salt
위 두가지 암호화를 보다 보면 공통적으로 들어가는 salt라는 게 존재하는데, 이 salt는 엄청나게 중요한 값입니다.
여기 비밀번호가 1004인 사람이 존재한다고 가정해봅시다.
이때 salt값이 고정값으로 'password'라는 문자열을 설정을 해놓으면 비밀번호가 1004인 모든 사람의 암호화된 비밀번호 값이 '$2b$10$6S8zqi82fcInHujCKB7dne0n4MgNvH28HWVM4o9leOfKOM/raVHo6'로, 똑같은 database에 저장이 되게 됩니다. 그렇기 때문에 우리는 salt값을 랜덤 하게 받아서 암호화를 하는 것입니다.
예시
password : 1234 salt : E1F53135E559C253 해시될 문자열 : 1234E1F53135E559C253 해시된 값 : 72AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8 |
password : 1234 salt : 84B03D034B409D4E 해시될 문자열 : 123484B03D034B409D4E 해시된 값 : B4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A |
우리가 database에 암호화된 비밀번호를 저장하게 되면 어떻게 로그인을 할 수 있을까요?
database에 저장된 비밀번호를 복호화해서 사용하는 걸까요?
정답은 우리가 입력한 값을 동일한 salt로 암호화했을 때 일치하는가를 확인하는 것입니다.
그럼 위 두 가지 모듈의 비밀번호 일치하는가를 확인하는 방법에 대해서 알아봅시다.
crypto
const [user] = conn.query(~~)
const hashPassword = crypto
.pbkdf2Sync(password, user.salt, 10000, 64, "sha512")
.toString("base64");
if (user.password === hashPassword) {
return res.status(200).end()
}
bcrypt
bcrypt.compare(pw, bashPw, (err, match) => {
console.log(match);
});
crypto는 암호화했을 때처럼 똑같은 salt를 넣어 같은 암호화값을 구하고 database의 password와 비교하여 응답을 보내고, bcrypt 같은 경우에는 compare를 이용하여 database의 password값과 비교할 수 있다.
'프로그래밍📚 > node' 카테고리의 다른 글
node의 파일 구조 (0) | 2024.01.02 |
---|---|
유효성 검사 (express-validator) (0) | 2023.12.24 |
router와 app.use() (0) | 2023.12.17 |
백엔드에서의 예외 처리 (0) | 2023.12.13 |
API 설계를 위한 팁 (0) | 2023.12.11 |