Spring Security에서의 사용자 인증: UserDetailsService와 HttpServletRequest의 차이점

coldrice99·2024년 11월 2일
0
post-thumbnail

Spring Security에서 UserDetails와 UserDetailsService가 필요한 이유

Spring Security를 활용해 인증/인가 필터를 구현하다 보면 UserDetailsUserDetailsService를 구현하는 과정이 포함됩니다. 처음엔 왜 굳이 이 클래스들이 필요한지 의문이 들었지만, Spring Security의 인증 과정과 표준화된 보안 구조를 이해하면서 그 이유를 알게 되었습니다.

1. UserDetails와 UserDetailsService의 역할

  • UserDetails

    • 사용자 정보 모델링: UserDetails 인터페이스는 인증 및 권한 정보를 표준화된 형식으로 제공합니다.
    • 필수 메서드: getUsername(), getPassword(), getAuthorities() 같은 메서드가 있어, 기본적인 사용자 정보와 계정 상태(잠금 여부, 활성화 여부)를 제공합니다.
    • 확장성: UserDetails를 구현한 UserDetailsImpl 클래스에 프로젝트에 필요한 추가 정보를 쉽게 담을 수 있습니다.
  • UserDetailsService

    • 사용자 조회 로직 정의: Spring Security는 UserDetailsService를 호출해 사용자를 조회합니다. UserDetailsService는 사용자 이름(보통 username)을 기반으로 사용자를 조회하는 역할을 합니다.
    • 데이터베이스 연결: UserDetailsServiceImpl 클래스에서 데이터베이스를 통해 사용자를 조회하고, 인증에 활용될 사용자 정보를 UserDetails로 반환합니다.

2. 직접 구현이 필요한 이유

Spring Security의 AuthenticationManagerUserDetailsService를 호출해 사용자 정보를 가져온 후, 비밀번호 일치 여부와 권한을 검증합니다. 이 구조를 따름으로써, Spring Security와 자연스럽게 연동되어 인증 관리가 용이해지고, 코드 유지보수가 쉬워집니다. 반면 UserDetailsUserDetailsService 없이 인증 필터를 직접 구현하면, 인증 과정과 인증 정보 관리 방식을 직접 설계해야 하므로 복잡성이 높아집니다.

3. Spring Security 인증의 표준화된 구조

UserDetailsUserDetailsService를 사용하면 Spring Security의 표준 인증 절차에 맞추어 사용자 인증을 쉽게 처리할 수 있습니다. 이를 통해 보안 관리가 체계적이고 표준화되어 유지보수와 확장성이 좋아집니다.


Spring Security vs HttpServletRequest를 통한 사용자 정보 접근 방식

그렇다면, HttpServletRequest에서 사용자 정보를 가져오는 것과 어떤 차이점이 있을까요? Spring Security를 통해 사용자 정보를 가져오면 더 강력한 인증/인가 관리가 가능하며, 일관된 보안 처리가 가능합니다. 차이점은 아래와 같습니다.

주요 차이점

  1. 일관된 보안 처리

    • Spring Security는 인증 과정에서 계정의 만료 여부, 잠금 상태, 활성화 여부 등을 표준화된 흐름으로 검증합니다.
    • HttpServletRequest는 단순히 요청에 담긴 사용자 정보를 읽어올 뿐, 계정 상태를 검사하는 기능이 없습니다.
  2. 내장된 보안 기능

    • UserDetailsUserDetailsService를 사용하면 Spring Security의 세션 관리, 권한 기반 접근 제어, 비밀번호 암호화 등의 보안 기능을 쉽게 활용할 수 있습니다.
    • 반면, HttpServletRequest로만 사용자 정보를 다룰 경우 이러한 기능을 직접 구현해야 하고, 특히 세션 관리나 권한 검사는 매우 복잡해질 수 있습니다.
  3. 권한 관리 및 역할 기반 접근 제어

    • UserDetails는 사용자 권한을 GrantedAuthority로 포함하여, Spring Security가 권한을 필터링하고 검사하는 데 활용됩니다.
    • HttpServletRequest로는 요청 헤더에서 역할을 수동으로 읽어와야 하며, 권한 검사 기능을 별도로 구현해야 합니다.
  4. 세션 및 상태 관리

    • Spring Security는 세션을 기반으로 사용자를 추적하고, 로그아웃 시 세션 만료, 계정 상태(잠김, 비활성화) 등을 관리합니다.
    • HttpServletRequest로 세션을 직접 관리하는 것도 가능하지만, 인증 상태 확인 로직을 직접 구현해야 하므로 복잡성이 증가합니다.
  5. 확장성 및 유지보수성

    • Spring Security는 OAuth, JWT, LDAP 등 다양한 인증 방식을 쉽게 추가할 수 있도록 확장성이 뛰어납니다.
    • HttpServletRequest를 사용하는 방식은 요구사항이 많아질수록 복잡해져, 확장과 유지보수가 어렵습니다.

요약

HttpServletRequest에서 사용자 정보를 직접 가져오는 방식은 기본적인 요청 분석에는 적합하지만, Spring Security를 사용하여 UserDetailsUserDetailsService를 통해 사용자 정보를 관리하는 것이 인증, 인가, 세션 관리, 권한 제어 등에서 훨씬 안전하고 유지보수하기에 용이합니다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글