이 글은 ‘오픈튜토리얼스-생활코딩’의 Egoing님의 강의를 정리했음을 먼저 밝힙니다.
웹 애플리케이션을 잘 동작하도록 만드는 것도 중요하지만 그보다 더 중요한 것은 내가 만든 웹 애플리케이션을 이용하는 사용자들의 개인정보가 익명의 공격자에 의해 유출되지 않도록 보호하는 것 입니다. 개인정보를 해킹하는 공격 방법은 무수히 다양하지만 그 중 가장 기본적인 bcrypt에 대해서 알아보도록 하겠습니다.
사용자의 개인정보를 보호하기 위해서는 익명의 공격자가 사용자의 개인정보를 알아보지 못하도록 암호화 해야합니다. 이 뿐만 아니라, 웹 애플리케이션을 만든 담당 개발자 조차도 사용자들의 개인정보를 알아보지 못하도록 해야합니다. 만약, '111111'이라는 비밀번호를 입력했다고 하면 이 비밀번호는 bcyrpt를 거쳐 '$I1287s72&829(5+wld' 이런 알아보기 힘든 문자로 암호화 되어 나옵니다. 그렇기 때문에 공격자나 개발자는 이 암호가 무엇을 의미하는지 알아낼 수 없게 됩니다.
나중에 사용자가 다시 로그인 하기 위해서 '111111'이라는 비밀번호를 다시 입력하면 이 비밀번호는 bcyrpt를 거쳐 다시 '$I1287s72&829(5+wld'로 암호화 되어 나오고, 이 정보가 이전의 암호정보와 일치하기 때문에, 개발자가 이 암호의 원래 값이 무엇인지는 몰라도 사용자가 웹 사이트에 로그인 하도록 처리 할 수 있습니다.
bcrypt 적용
bcrypt npm이라고 구글에 검색을 하면 bcrypt npm 라이브러리가 나옵니다. 그럼 그 링크를 클릭해서 bcrypt npm 라이브러리를 설치를 진행합니다. 터미널에서 npm install -s bcrypt
명령을 입력하면 설치가 진행됩니다.
const bcrypt = require('bcrypt');
const saltRounds = 10;
const temp1 = 's0/\/\P4$$w0rD';
const temp2 = 'not_bacon';
bcrypt.hash(temp1, saltRounds, function(err, hash) {
bcrypt.compare(temp1, hash, function(err, result) {
console.log('my password', result);
})
bcrypt.compare(temp2, hash, function(err, result) {
console.log('other password', result);
})
});
위의 코드를 설명하도록 하겠습니다.
const bcrypt = require('bcrypt')
: bcrypt 모듈을 로드합니다.const saltRounds = 10
: 공격자가 쉽게 공격 할 수 없도록 노이즈 값을 설정합니다.bcrypt.hash(temp1, saltRounds, function(err, hash) {...}
: temp1으로 넣은 비밀번호가 hash라는 값으로 암호화됩니다.bcrypt.compare(temp1, hash, function(err, result) { console.log('my password', result); })
: true가 출력 됩니다.bcrypt.compare(temp2, hash, function(err, result) { console.log('my password', result); })
: false가 출력 됩니다.
이제 이 내용을 우리의 웹 애플리케이션 로그인 파트에 적용시켜보면,
bcrypt.hash(pwd, 10, function (err, hash) {
var user = {
id: shortid.generate(),
email: email,
password: hash,
displayName: displayName
};
db.get('users').push(user).write();
request.login(user, function (err) {
console.log('redirect');
return response.redirect('/');
})
}
이런 식으로 password의 value에 진짜 비밀번호가 아닌 hash값을 저장하는 식으로 수정해 주면 됩니다. (위의 코드는 전체 코드의 일부만 떼어 온 것입니다. 첫번째 줄과 다섯번째 줄만 주의해서 확인하면 될 것 같습니다.)