이전 시간에 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