본문 바로가기

프로그래밍/Spring

패스워드 암호화

패스워드를 왜 암호화해서 저장해야하는가

패스워드는 평문으로 저장하면 안됩니다. 그 이유는 다양하지만 큰 이유는 2가지 정도가 있습니다.

  • 해당 서비스의 관리자가 db에서 모든 사용자의 비밀번호를 볼 수 있으며 db가 털리는 경우 공격자에게 계정 정보가 넘어갈 수 있기 때문
  • 일반적으로 id와 password를 여러곳에서 쓰는 경우가 많아서 추가적인 피해가 발생할 수 있기 때문입니다.

PasswordEncoder

스프링 시큐리티에서 비밀번호를 암호화 하도록 단방향 해시를 위한 PasswordEncoder 인터페이스와 구현체들을 지원하는데 그중에서 BcryptPasswordEncoder에대해 알아봅시다.

BcryptPasswordEncoder

Bcrypt 해시함수를 사용하여 패스워드를 암호화를 할 수 있습니다. BcryptPasswordEncoder는 의도적으로 느리게 동작하여 Bruteforce 어택이나 Rainbow table attack과같은 공격에 대한 견딜 수 있도록 설정되어 있습니다. 속도의 강도(strength)는 4 ~ 31사이의 값으로 설정할 수 있으며 기본값은 10을 사용합니다.

인코딩을 할 때 encode()메소드를 사용하며 평문 패스워드와 salt로 해쉬를 하며 salt가 매번 바뀌어 같은 패스워드를 가진 회원을 여러명 저장하여도 db에서 볼때는 다르게 보입니다.

평문 패스워드와 인코딩된 패스워드를 비교할때는 matches()메소드를 사용하며 평문인 패스워드와 인코딩된 패스워드를 해시를 한 값이 인코딩된 패스워드와 같은지 비교하기 때문에 salt가 매번 바뀌어도 비교하는데 문제가 없습니다.

salt를 사용하면 브루트 포스 공격의 일종인 딕셔너리 어택의 위험을 줄일 수 있습니다. 해커가 미리 단어들을 해쉬해두고 저장해두었고 db정보를 취득하여 해쉬된 패스워드를 얻게 된다면 탈취한 패스워드를 자신이 저장해둔 암호들과 비교하여 단어를 유추할 수 있는데 salt를 사용하여 이 위험성을 줄일 수 있습니다.

'프로그래밍 > Spring' 카테고리의 다른 글

Errors나 BindingResult사용시 주의할 점  (0) 2020.08.09
스프링 부트의 오류처리(Error Handling)  (0) 2020.07.05
스프링부트의 자동설정  (0) 2020.06.21
스프링 AOP  (0) 2020.04.19
빈의 스코프  (0) 2020.03.18