02.17 Spring Security (2)

2023. 2. 17. 10:02개발일지

비밀번호 암호화
  • 회원 등록 시 '비밀번호'는 사용자가 입력한 문자 그대로 DB에 등록하면 안됩니다. '정보통신망법', '개인정보보호법'에 의해 비밀번호 암호화(Encryption)가 의무입니다.

비밀번호 저장의 역사 요약
  • 암호화된 패스워드를 가져가도 복호화 할 수 없도록 단방향 해시를 적용하여 비밀번호를 암호화하는 것이 관행이었습니다.
  • 레인보우 테이블과 같은 룩업 테이블을 만들어서 비밀번호를 미리 계산해서 저장하여 사용하는 해킹방식이 등장했습니다.
  • 개발자들은 해결책으로 솔티드 패스워드를 사용, 이는 단순하게 해시 함수를 입력하는 것이 아니라 모든 사용자의 비밀번호를 랜덤 바이트를 만들어 비밀번호와 함께 사용하여 암호화해서 유니크한 해시값을 생성하여 사용했습니다.
  • 하지만 하드웨어의 발전으로 모든 비밀번호를 쉽게 해독할 수 있게 되었으며, 현재는 적응형 단방향 함수로 비밀번호를 저장하는 것을 추천하고 있습니다.
  • Spring Security는 적응형 단방향 함수를 쉽게 사용할 수 있도록 미리 만들어 제공합니다.
결론
Spring Security가 제공하는 적응형 단방향 함수인 bCrypt를 사용하여 비밀번호를 암호화합니다.

적응형 단방향 함수는 내부적으로 리소스의 낭비가 매우 심하기 때문에 API 요청마다 사용자의 이름과 비밀번호를 검증하면 애플리케이션 성능이 크게 떨어질 수 있습니다. 따라서 세션, 토큰과 같은 인증방식을 사용하여 검증하는 것이 속도 및 보안 측면에 유리합니다.

사용자 검증 흐름 짚기
1. 사용자는 회원가입을 진행합니다.
2. 사용자의 정보를 저장할 때 비밀번호를 암호화하여 저장합니다.
3. 사용자는 로그인을 진행합니다.
4. 사용자가 입력한 정보를 통해 저장된 암호화된 비밀번호를 가져와 사용자가 입력한 암호와 비교합니다.
5. 사용자 인증이 성공하면 사용자의 정보를 사용하여 JWT 토큰을 생성하여 Header에 추가하여 반환하고 Client는 이를 쿠키저장소에 저장합니다.
6. 사용자는 게시글 작성과 같은 요청을 진행할 때 발급받은 JWT 토큰을 같이 보내고 서버는 이를 빠르게 인증하고 사용자의 요청을 수행합니다.

Password Matching
  • 비밀번호를 암호화하는 함수를 제공할 뿐만 아니라 사용자가 입력한 비밀번호를 저장된 비밀번호와 비교하여 일치여부를 확인해주는 함수도 제공합니다.
// 사용예시
// 비밀번호 확인
if(!passwordEncoder.matches("사용자가 입력한 비밀번호", "저장된 비밀번호")) {
		   throw new IllegalAccessError("비밀번호가 일치하지 않습니다.");
 }
  • boolean matches(CharSequence rawPassword, String encodedPassword);
  • rawPassword : 사용자가 입력한 비밀번호
  • encodedPassword : 암호화되어 DB에 저장된 비밀번호

 

'개발일지' 카테고리의 다른 글

02.18 Spring Test  (0) 2023.02.18
02.18 OAuth2  (0) 2023.02.18
02.17 Spring Security (1)  (0) 2023.02.17
02.16 연관관계  (0) 2023.02.16
02.13 @Valid와 @Validated의 차이점  (0) 2023.02.13