이 글은 ‘오픈튜토리얼스-생활코딩’의 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값을 저장하는 식으로 수정해 주면 됩니다. (위의 코드는 전체 코드의 일부만 떼어 온 것입니다. 첫번째 줄과 다섯번째 줄만 주의해서 확인하면 될 것 같습니다.)