Spring Security 의인증 관리

2024. 3. 13. 11:48Spring

목차

     

    전체적인 흐름

    1.  SecurityContextHolder

    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 설정
        •  

    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();