Spring Security / / 2024. 12. 18. 15:19

Authentication Resolver

Authentication Resolver는 Spring Security에서 인증(Authentication) 객체를 해결(Resolve)하거나 생성하는 역할을 담당하는 개념입니다. 주로 Spring Security의 인증 흐름에서, 인증 정보를 어떤 방식으로 처리할지를 결정합니다.

일반적으로 Spring Security에 Authentication 객체를 전달하기 위해 Custom Resolver를 작성하거나 커스텀 로직을 구현할 때 사용됩니다.


1. Authentication Resolver란?

  • Authentication Resolver사용자의 인증 정보를 해석(Resolve) 하고,
  • 적절한 Authentication 객체를 생성하거나 반환하는 컴포넌트입니다.
  • HttpServletRequest, HTTP 헤더, JWT Token 등에서 인증 정보를 가져와 처리하는 역할을 합니다.

2. Authentication Resolver가 필요할 때

기본 인증 처리

  • Spring Security는 기본적으로 UsernamePasswordAuthenticationFilter 등에서 인증 정보를 처리합니다.
  • 하지만 특정 요청이나 커스텀 인증 방식이 필요할 경우 Authentication Resolver를 직접 구현할 수 있습니다.

사용 사례

  1. JWT 기반 인증: Authorization 헤더에서 Bearer Token을 가져와 검증 후 Authentication 객체를 생성.
  2. API 키 인증: 요청 파라미터나 헤더에서 API 키를 추출해 인증 처리.
  3. 멀티 테넌시 인증: 테넌트 정보와 함께 사용자 정보를 검증.
  4. 커스텀 필터 인증: 특정 요청에 대해 필터링 및 커스텀 인증 수행.

3. Authentication Resolver의 작동 방식

  1. 요청 데이터 추출

    • HttpServletRequest, Authorization 헤더, 쿠키 등에서 인증 정보를 추출합니다.
  2. Authentication 객체 생성

    • 추출한 인증 정보를 바탕으로 Authentication 객체를 생성합니다.
  3. Authentication Manager 위임

    • 생성된 Authentication 객체를 AuthenticationManager로 전달하여 인증을 수행합니다.
  4. SecurityContext 설정

    • 인증에 성공하면 Authentication 객체를 SecurityContextHolder에 저장합니다.

4. Custom Authentication Resolver 예시

다음은 JWT Token을 처리하는 Custom Authentication Resolver의 예시입니다.

Custom Authentication Resolver

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
public class JwtAuthenticationResolver {

    private final JwtTokenService jwtTokenService; // JWT 검증 서비스 (가정)

    public JwtAuthenticationResolver(JwtTokenService jwtTokenService) {
        this.jwtTokenService = jwtTokenService;
    }

    public void resolve(HttpServletRequest request) {
        // Authorization 헤더에서 Bearer Token 추출
        String authorizationHeader = request.getHeader("Authorization");
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            String token = authorizationHeader.substring(7); // Bearer 이후의 토큰만 추출

            // JWT 토큰 검증
            if (jwtTokenService.validateToken(token)) {
                String username = jwtTokenService.extractUsername(token);

                // 인증 객체 생성
                Authentication authentication =
                        new UsernamePasswordAuthenticationToken(username, null, jwtTokenService.getAuthorities(token));

                // SecurityContext에 인증 객체 저장
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }
    }
}

설명

  1. 헤더에서 토큰 추출: HTTP 요청의 Authorization 헤더에서 Bearer Token을 가져옵니다.
  2. 토큰 검증: jwtTokenService를 통해 토큰을 검증하고 사용자 정보를 추출합니다.
  3. Authentication 객체 생성: UsernamePasswordAuthenticationToken을 생성합니다.
  4. SecurityContext에 저장: SecurityContextHolder에 인증 객체를 저장합니다.

5. Authentication Resolver를 필터에서 사용하기

위에서 구현한 JwtAuthenticationResolver를 필터에서 호출합니다.

import org.springframework.stereotype.Component;

import javax.servlet.FilterChain;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component
public class JwtAuthenticationFilter implements Filter {

    private final JwtAuthenticationResolver authenticationResolver;

    public JwtAuthenticationFilter(JwtAuthenticationResolver authenticationResolver) {
        this.authenticationResolver = authenticationResolver;
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;

        // Custom Authentication Resolver 호출
        authenticationResolver.resolve(httpRequest);

        // 다음 필터로 진행
        chain.doFilter(request, response);
    }
}

6. 정리

  • Authentication Resolver인증 정보를 해석(Resolve) 하여 Authentication 객체를 생성하고 SecurityContext에 저장하는 역할을 합니다.
  • 주로 JWT 토큰, API 키, 커스텀 인증 필터와 같은 상황에서 사용됩니다.
  • Custom Resolver를 구현하면 Spring Security의 인증 로직을 더욱 세밀하게 제어할 수 있습니다.
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유