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
SecurityContextHolder
는 SecurityContext
를 전역적으로 관리하는 클래스입니다. 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 |