Spring Security 의인증 관리
2024. 3. 13. 11:48ㆍSpring
목차
전체적인 흐름
1. SecurityContextHolder
- 사용자 인증 정보인 Principal은 SecurityContextHolder -> SecurityContext -> Authentication 에 보관
- Principal 정보는 AuthenticationProvider 인터페이스를 이용해 구성하여 사용한다.
- AuthenticationProvider: springframework.sercurity.authentication
2. JWT token 구성
- extends AbstractAuthenticationToken
3.AuthenticationProvider 구성
- 인증 수행
- JWT 기반일 경우: AccessToken, RefreshToken이 유효한지 검사
- id, password 기반 인증 경우 : username / password 가 유효한지 검사
- Override authenticate
- JWT token 구성하여 리턴
4. ProviderManager 구성
- AuthenticationManager의 가장 일반적인 구현체이다.
- ProviderManager는 AuthenticationProvider 목록을 위임 받는다.
- 각 AuthenticationProvider는 인증 성공, 실패, 결정할 수 없음을 나타낼 수 있고, 나머지 AuthenticationProvider가 결정을 할 수 있도록 전달한다.
- 리펙토링 진행하지 않아도 무관
5. AuthenticationFilter 구성
- 인증 요청을 가로채고, Authentication 객체를 만든 뒤 AuthenticationManager에게 인증 역할을 위임.
- filter 종류
- UsernamePasswordAuthenticationFilter
- BasicAuthenticationFilter
- OncePerRequestFilter
- 등등
- extends OnPerRequestFilter
- Http Request의 한 번의 요청에 대해서 한번만 실행하는 Filter
- 자원 낭비를 방지. 동일한 요청안에서 한번만 filtering을 할 수 있게 해준다.
- doFilter()
- 최초 실행 시 ServeletRequest 객체에 자신의 이름과 수행하였음을 표시하기 위한 Boolean 값을 함께 넣어둔다.
- doFilterInternal() 실행
- 리다이렉트로 다시 실행되는 경우 이전 수행에서 요청 객체에 담아뒀던 수행 여부를 확인하고, 이미 수행했다면 Filter Chain에게 요청과 응답 객체를 전달
- Override doFilterInternal()
- AccessToken, RefreshToken 등 인증 정보를 담은 JWT token 생성
- authenticationManager에 JWT token 등록
- SecurityContextHolder-Context-Authentication 설정
- Http Request의 한 번의 요청에 대해서 한번만 실행하는 Filter
6. 로그인 정보 사용
- 예시
public class SecurityUtils {
public static UserDetails getCurrentUserDetail() {
# SecurityContextHolder의 Context 조회
SecurityContext securityContext = SecurityContextHolder.getContext();
# securityContext의 Authentication 조회
Authentication authentication = securityContext.getAuthentication();
# Authentication의 getPrincipal 조회
return (UserInfo) authentication.getPrincipal();
'Spring' 카테고리의 다른 글
[SpringBoot] 테스트 환경 구축(MySQL docker) (1) | 2024.03.22 |
---|---|
FeignClient를 이용한 API 호출(HttpClient) (0) | 2024.03.13 |
Spring AOP 정리 (0) | 2024.03.12 |
@Resource, @Autowired, @Inject 차이점(feat. @Qualifier) (0) | 2021.10.18 |
Intellij 자동주석 템플릿 (0) | 2021.10.06 |