Spring Security를 활용해 인증/인가 필터를 구현하다 보면 UserDetails와 UserDetailsService를 구현하는 과정이 포함됩니다. 처음엔 왜 굳이 이 클래스들이 필요한지 의문이 들었지만, Spring Security의 인증 과정과 표준화된 보안 구조를 이해하면서 그 이유를 알게 되었습니다.
UserDetails
UserDetails
인터페이스는 인증 및 권한 정보를 표준화된 형식으로 제공합니다.getUsername()
, getPassword()
, getAuthorities()
같은 메서드가 있어, 기본적인 사용자 정보와 계정 상태(잠금 여부, 활성화 여부)를 제공합니다.UserDetails
를 구현한 UserDetailsImpl
클래스에 프로젝트에 필요한 추가 정보를 쉽게 담을 수 있습니다.UserDetailsService
UserDetailsService
를 호출해 사용자를 조회합니다. UserDetailsService
는 사용자 이름(보통 username
)을 기반으로 사용자를 조회하는 역할을 합니다.UserDetailsServiceImpl
클래스에서 데이터베이스를 통해 사용자를 조회하고, 인증에 활용될 사용자 정보를 UserDetails
로 반환합니다.Spring Security의 AuthenticationManager
는 UserDetailsService
를 호출해 사용자 정보를 가져온 후, 비밀번호 일치 여부와 권한을 검증합니다. 이 구조를 따름으로써, Spring Security와 자연스럽게 연동되어 인증 관리가 용이해지고, 코드 유지보수가 쉬워집니다. 반면 UserDetails
와 UserDetailsService
없이 인증 필터를 직접 구현하면, 인증 과정과 인증 정보 관리 방식을 직접 설계해야 하므로 복잡성이 높아집니다.
UserDetails
와 UserDetailsService
를 사용하면 Spring Security의 표준 인증 절차에 맞추어 사용자 인증을 쉽게 처리할 수 있습니다. 이를 통해 보안 관리가 체계적이고 표준화되어 유지보수와 확장성이 좋아집니다.
그렇다면, HttpServletRequest
에서 사용자 정보를 가져오는 것과 어떤 차이점이 있을까요? Spring Security를 통해 사용자 정보를 가져오면 더 강력한 인증/인가 관리가 가능하며, 일관된 보안 처리가 가능합니다. 차이점은 아래와 같습니다.
일관된 보안 처리
HttpServletRequest
는 단순히 요청에 담긴 사용자 정보를 읽어올 뿐, 계정 상태를 검사하는 기능이 없습니다.내장된 보안 기능
UserDetails
와 UserDetailsService
를 사용하면 Spring Security의 세션 관리, 권한 기반 접근 제어, 비밀번호 암호화 등의 보안 기능을 쉽게 활용할 수 있습니다.HttpServletRequest
로만 사용자 정보를 다룰 경우 이러한 기능을 직접 구현해야 하고, 특히 세션 관리나 권한 검사는 매우 복잡해질 수 있습니다.권한 관리 및 역할 기반 접근 제어
UserDetails
는 사용자 권한을 GrantedAuthority
로 포함하여, Spring Security가 권한을 필터링하고 검사하는 데 활용됩니다.HttpServletRequest
로는 요청 헤더에서 역할을 수동으로 읽어와야 하며, 권한 검사 기능을 별도로 구현해야 합니다.세션 및 상태 관리
HttpServletRequest
로 세션을 직접 관리하는 것도 가능하지만, 인증 상태 확인 로직을 직접 구현해야 하므로 복잡성이 증가합니다.확장성 및 유지보수성
HttpServletRequest
를 사용하는 방식은 요구사항이 많아질수록 복잡해져, 확장과 유지보수가 어렵습니다.HttpServletRequest
에서 사용자 정보를 직접 가져오는 방식은 기본적인 요청 분석에는 적합하지만, Spring Security를 사용하여 UserDetails
와 UserDetailsService
를 통해 사용자 정보를 관리하는 것이 인증, 인가, 세션 관리, 권한 제어 등에서 훨씬 안전하고 유지보수하기에 용이합니다.