[Spring Security] InMemoryUserDetailManager

minseok Kim·2025년 2월 16일

Spring Security

목록 보기
8/15

저번 포스트까지는 application.yml에서 username, password를 명시하여 인증 과정을 진행했으나 실제 프로덕트 환경에서는 한 명 이상의 유저 정보를 저장할 필요가 있다.
여러 유저의 인증 정보를 저장하는 방식으로 애플리케이션 내 메모리에 저장하는 방식과, 외부 DB에 저장하는 방식으로 나눌 수 있는데, 이번엔 메모리 내 유저 정보를 저장하는 방식을 알아보았다.


SecurityConfig.java

Spring Security에서 유저 정보는 UserDetails이라는 객체에 저장한다.
UserDetails은 유저 정보를 저장하는 인터페이스로, 해당 인터페이스의 구현체인 User를 사용하여 유저 정보를 생성하고 이를 메모리에 저장할 수 있다.

User 클래스를 통해 username, password, authorities를 설정할 수 있고, password를 설정하기 위해서는 passwordEncoder를 bean으로 추가하여 어떤 password를 저장할 때 passwordEncoder를 지정해야 한다.



위 처럼 passwordEncoder를 bean으로 추가하였다.
위 주석처리한 코드와 아래 코드는 같은 역할을 하는데, 아래 처럼 사용하는 것을 추천한다.
Spring에서는 passwordEncoder로 BCrypt를 사용하는 것을 권장하는데, 레거시를 지원하는 애플리케이션에서는 BCrypt말고 다른 인코더를 사용할 수 있다. PasswordEncoderFacotries.createDelegatingPasswordEncoder()를 사용하면 기본 값으로 BCrypt를 사용하고, password에 {noop}와 같은 접두사를 사용하면 다른 encoder를 사용할 수 있다.



위 코드를 보면, Spring에서 권장하는 BCrypt를 기본값으로 설정되어있고, ldap, noop 등의 접두사를 통해 다른 인코더를 사용할 수 있다.
만약 BCrypt에서 보안 상 문제가 발생하여 다른 인코더를 권장하도록 변경된다면, SecurityConfig.java 파일의 변경 없이 변경을 반영할 수 있을 것이다.
물론 프로젝트에서 password 인코딩에 BCrypt만 사용한다면 new BCryptPasswordEncoder()를 사용해도 무관하다.



다음으로 CompromisedPasswordChecker를 반환하는 bean을 추가하였다. 이는 사용자의 password가 보안적으로 안전한지를 검사하는 기능을 지원하는데, 여러 구현체 중 HaveIBeenPwnedRestApiPasswordChecker를 사용하였다.

해당 파일로 이동하여 설명을 읽어보면 아래와 같이 써져 있는데,

'Have I Been Pwned Rest API'라는 사이트에서 password가 유출되었는지를 파악하여 사용자가 안전한 password를 사용하도록 도움을 준다.
Spring Security 6.3 이상의 버전에서만 사용가능 한 것도 알 수 있다.

"user"라는 username을 가진 계정의 비밀번호를 12345라고 설정하고 로그인을 시도하면 아래와 같은 경고 메시지가 뜬다. 비밀번호가 안전하지 않다고 판단하여 안전한 비밀번호로 바꿔달라는 내용이다.

비밀번호를 Bingseok@12345와 같이 안전한 비밀번호로 바꾸고 로그인하면 성공적으로 로그인이 진행된다.

0개의 댓글