본문 바로가기
Springboot Study/Springboot Security

Spring Security에서 중요한 인터페이스들

by xogns93 2024. 10. 30.

Spring Security에서 중요한 인터페이스들은 인증(Authentication), 인가(Authorization),

그리고 보안 상태 관리와 관련된 기능을 제공합니다.


1. UserDetails

UserDetails는 Spring Security에서 사용자 정보를 나타내는 인터페이스입니다. 사용자 정보의 형태를 정의하여, Spring Security가 인증을 위해 사용하는 사용자 정보를 일관되게 관리할 수 있습니다.

  • 주요 메서드:
    • getUsername(): 사용자의 이름(예: ID) 반환.
    • getPassword(): 암호화된 비밀번호 반환.
    • getAuthorities(): 사용자에게 부여된 권한 목록 반환.
    • isAccountNonExpired(): 계정 만료 여부 확인.
    • isAccountNonLocked(): 계정 잠김 여부 확인.
    • isCredentialsNonExpired(): 자격 증명(비밀번호) 만료 여부 확인.
    • isEnabled(): 계정 활성화 여부 확인.

사용 예시:

  • Spring Security의 인증 시스템에서 UserDetails를 구현한 클래스는 사용자 정보를 캡슐화합니다.
  • CustomUserDetails와 같은 클래스를 만들고 UserDetails를 구현하여 사용자 엔터티(User Entity)와 연결시킬 수 있습니다.

2. UserDetailsService

UserDetailsService사용자의 정보를 불러오는 서비스 인터페이스로, 주로 사용자 이름을 기반으로 데이터를 조회하여 UserDetails 객체를 반환하는 역할을 합니다.

  • 주요 메서드:
    • loadUserByUsername(String username): 주어진 사용자 이름으로 UserDetails 객체를 찾아 반환합니다.

사용 예시:

  • UserDetailsService를 구현한 JpaUserDetailsService 같은 서비스 클래스에서 사용자 이름을 기반으로 User 정보를 데이터베이스에서 조회하여, UserDetails 객체로 변환해 반환할 수 있습니다.

3. GrantedAuthority

GrantedAuthority사용자의 권한(예: ROLE_USER, ROLE_ADMIN)을 표현하는 인터페이스입니다.

  • 주요 메서드:
    • getAuthority(): 특정 권한을 문자열로 반환.

사용 예시:

  • UserDetails 객체의 권한을 정의할 때 GrantedAuthority를 사용하여, Spring Security가 인증된 사용자의 접근 권한을 쉽게 확인할 수 있도록 합니다.

4. Authentication

Authentication인증된 사용자 또는 인증 과정 중인 사용자를 나타내는 인터페이스입니다. 이 객체는 SecurityContext에 저장되어 현재 사용자 정보를 담고 있습니다.

  • 주요 속성:
    • getPrincipal(): 사용자의 주체를 나타내는 객체(일반적으로 UserDetails).
    • getCredentials(): 인증에 필요한 자격 증명(비밀번호 또는 토큰).
    • getAuthorities(): 사용자가 가진 권한 목록.

사용 예시:

  • Spring Security가 인증 성공 시 Authentication 객체를 생성하여 SecurityContext에 저장합니다. 이를 통해 애플리케이션 전체에서 현재 로그인된 사용자 정보를 참조할 수 있습니다.

5. AuthenticationManager

AuthenticationManager인증 요청을 처리하고, 인증을 수행하는 인터페이스입니다. 주로 AuthenticationProvider와 협력하여 인증 로직을 수행합니다.

  • 주요 메서드:
    • authenticate(Authentication authentication): 인증 요청을 받아서 인증을 수행하고, 성공 시 Authentication 객체를 반환합니다.

사용 예시:

  • 여러 AuthenticationProvider를 통해 다양한 방식의 인증을 지원할 수 있습니다. 예를 들어, 기본적인 사용자 이름/비밀번호 인증 외에도 API 토큰 인증을 추가할 수 있습니다.

6. AuthenticationProvider

AuthenticationProvider특정 인증 방식을 처리하는 컴포넌트입니다. 여러 종류의 인증 방식을 처리할 수 있도록 다양한 AuthenticationProvider를 구현하여 AuthenticationManager에서 사용할 수 있습니다.

  • 주요 메서드:
    • authenticate(Authentication authentication): 인증을 수행합니다. 사용자가 제출한 자격 증명이 올바른지 확인하고, 올바르면 Authentication 객체를 반환합니다.
    • supports(Class<?> authentication): 주어진 인증 타입이 지원되는지 여부를 반환합니다.

사용 예시:

  • AuthenticationProviderService를 구현하여 사용자 이름과 비밀번호로 인증을 처리하거나, 추가적으로 API 키와 같은 다른 인증 방식도 처리할 수 있습니다.

7. SecurityContext

SecurityContext현재 사용자의 Authentication 정보를 저장하는 컨텍스트로, Spring Security가 현재 사용자 정보를 보관하는 기본적인 저장소 역할을 합니다.

  • 주요 메서드:
    • getAuthentication(): 현재 인증 정보를 반환합니다.
    • setAuthentication(Authentication authentication): 새로운 인증 정보를 설정합니다.

사용 예시:

  • Spring Security는 인증된 사용자 정보를 SecurityContext에 저장하고, 이를 통해 요청 처리 중 현재 사용자의 인증 정보를 유지합니다.

8. SecurityContextHolder

SecurityContextHolderSecurityContext를 전역적으로 관리하는 클래스입니다. SecurityContext는 인증된 사용자 정보를 저장하는 데 사용되며, 애플리케이션 전체에서 인증 정보를 접근할 수 있도록 지원합니다.

  • 주요 메서드:
    • getContext(): 현재 스레드의 SecurityContext를 반환합니다.
    • clearContext(): 현재 스레드의 SecurityContext를 초기화합니다.

사용 예시:

  • Spring Security는 기본적으로 스레드 로컬에 SecurityContext를 저장하고, 이를 통해 현재 요청을 처리하는 사용자 정보를 추적합니다.

9. AccessDecisionManager

AccessDecisionManager인가(Authorization)를 결정하는 인터페이스입니다. 사용자가 요청한 리소스에 접근할 수 있는지 여부를 판단하여 Spring Security에서 인가 결정을 내리는 데 사용됩니다.

  • 주요 메서드:
    • decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes): 접근 권한을 결정합니다. 현재 사용자에게 리소스 접근 권한이 있는지 여부를 검사합니다.

사용 예시:

  • 커스터마이징을 통해 리소스마다 접근 권한을 세부적으로 설정하거나, ROLE_ADMIN만 특정 페이지에 접근할 수 있도록 제한할 수 있습니다.

10. AccessDeniedHandler

AccessDeniedHandler인가 실패 시 발생하는 예외를 처리하는 인터페이스입니다. 권한이 없는 사용자가 접근하려고 할 때 발생하는 AccessDeniedException을 처리합니다.

  • 주요 메서드:
    • handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException): 인가 거부 예외 발생 시 처리 로직을 정의합니다.

사용 예시:

  • 사용자가 권한이 없는 페이지에 접근할 경우, 커스터마이징된 에러 페이지로 리다이렉트하거나 적절한 메시지를 반환할 수 있습니다.

11. PasswordEncoder

PasswordEncoder비밀번호를 암호화하고 검증하는 데 사용되는 인터페이스입니다. 비밀번호를 해시하고, 인증 시 해시된 비밀번호와 입력된 비밀번호를 비교하는 방식으로 사용됩니다.

  • 주요 메서드:
    • encode(CharSequence rawPassword): 원시 비밀번호를 해시하여 암호화된 비밀번호를 반환합니다.
    • matches(CharSequence rawPassword, String encodedPassword): 입력한 비밀번호와 해시된 비밀번호가 일치하는지 확인합니다.

사용 예시:

  • BCryptPasswordEncoder, SCryptPasswordEncoder와 같은 구현체를 사용하여 안전하게 비밀번호를 저장하고 검증할 수 있습니다.

12. RememberMeServices

RememberMeServices"Remember Me" 기능을 관리하는 인터페이스입니다. 사용자가 선택한 경우, 인증 상태를 유지하여 일정 시간 동안 다시 로그인하지 않고도 애플리케이션에 접근할 수 있게 합니다.

  • 주요 메서드:
    • autoLogin(HttpServletRequest request, HttpServletResponse response): "Remember Me" 쿠키나 토큰을 통해 자동 로그인을 수행합니다.
    • loginFail(HttpServletRequest request, HttpServletResponse response): 로그인 실패 시 "Remember Me" 쿠키를 제거합니다.
    • loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication): 로그인 성공 시 "Remember Me" 토큰을 설정합니다.

사용 예시:

  • 웹 애플리케이션에서 사용자가 로그인 상태를 유지하도록 할 때 사용됩니다.

요약

Spring Security의 주요 인터페이스는 인증, 인가, 사용자 정보 관리, 보안 상태 유지, 비밀번호 암호화 등의 기능을 제공합니다. 이러한 인터페이스를 통해 Spring Security는 다양한 보안 요구 사항을 유연하게 처리할 수 있으며, 애플리케이션에 맞춰 커스터마이징할 수 있습니다.

'Springboot Study > Springboot Security' 카테고리의 다른 글

CSRF(Cross-Site Request Forgery)  (0) 2024.10.31
Filter (FilterChain)  (0) 2024.10.31
스레드풀  (0) 2024.10.29
세션(Session)과 제이슨웹토큰(JSON Web Token)  (0) 2024.10.29
OAuth  (1) 2024.10.28