이전 시간에 pbkdf2 를 통해서 사용자의 패스워드를 암호화했다.
이제 이를 실전에 적용해보도록하자.
node를 통해서 암호화한 값의 salt와 password(hash 처리된) 값을 사용자의 데이터를 저장하고 있는 데이터의 정보에 저장한다.
(저장되어 있는 사용자의 정보)
var users = [
{
username: 'Juni_K',
salt: 'Gw6iS1wW4tQOVQ+qupK9O32i67UPRO+/nbEyyQVWJafxEUu1Yxl03WNyjld/WzVJLDOhzz+V5tsbu8PC0diDlA==',
password: 'rBtRP4248JzbLQr8KlJO1jCVVza1l5NHs14AqA/9vjy/g20Kilz586LmplcgqKymUNAi8EpGzF8NrRNfiCP9PIqoSG6NTdzOQC7sEOYmCrwZx92fWhZ6UF580P5uNPRaFjoB3ivKOkx9iRu9nZ8EqVqDEB4LI2RHvJI884otdec=',
displayName: 'JHK'
}
];
salt 와 password 를 수정하고, 저장한 데이터와 사용자가 입력 form 을 통해서 입력한 값을 비교하는 과정을 거친다.
for(var i=0; i < users.length, i++){
var user = users[i];
// 사용자가 입력한 uname 과 데이터로 저장되어있는 user.name이 같은지 비교
if(uname === user.user.name){
// return 을 작성하지 않으면, 반복문으로 인해서, 게속해서 돌기 때문에 return 을 적어준다.
// hasher 의 콜백함수는 제일 마지막에 실행되기 때문에 오류가 발생하기 때문이다.
return hasher({password:pwd, salt:user.salt}, function(err,pass,salt,hash){
// user.password 는 데이터에 입력되어있는 암호화처리된 패스워드
// hash는 바로 위에서 사용자가 입력한 값을 hasher로 hash한 값이다.
if(hash === user.password){
// 로그인에 성공했다면
req.session.displayName = user.displayName;
req.session.save(function(){
res.redirect('/welcome')
})
}else{
// 로그인에 실패했다면
res.send('Who are you? <a href="/auth/login">login</a>');
}
});
}
}
사용자가 form 을 통해서 입력한 값과 저장해둔 사용자의 데이터와 맞다면, '/welcome' 으로 이동하고,
만약, 다르다면, 다시 로그인하는 화면으로 이동한다.
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ed9f3c8b-484e-4802-a2d6-a3f5144d2d3f/AnyConv.com__200601.login_pbkdf2.mp4005.mp4