20230629 [Spring] Interceptor

Daisy🌷·2023년 6월 29일
0

Interceptor란?

Interceptor는 낚아채다의 의미를 가지고 있다.
HTTP 요청 및 응답을 가로채고 처리하는 구성 요소이다.
클라이언트에서 Server로 들어온 Request 객체를
Controller의 Handler로 도달하기 전에 가로채서
원하는 추가 작업이나 로직을 수행한 후 Handler로 보낼 수 있도록 해주는 Module이다.

Interceptor 예시 코드

AuthenticationInterceptor 클래스는 HandlerInterceptor 인터페이스를 구현하고 있다. 이 인터셉터는 HTTP 요청을 가로채어 처리하며, 요청의 인증을 담당한다.

  1. preHandle 메서드 : 이 메서드는 컨트롤러의 핸들러 메서드가 호출되기 전에 실행된다. HTTP 요청의 헤더에서 "Authorization"을 추출하고, 해당 값이 "Bearer "로 시작하는지 확인한다. 만약 그렇지 않다면, 요청을 계속 진행하도록 true를 반환한다.
  2. JWT 디코딩: "Authorization" 헤더가 "Bearer "로 시작하는 경우, 인증 토큰인 JWT(access token)를 추출한다. 그리고 jwtUtil 객체를 사용하여 JWT를 디코딩한다. jwtUtil.decode(accessToken) 호출은 JWT를 디코딩하여 사용자 식별자(UserId)를 반환한다.
  3. JWT가 성공적으로 디코딩되면, request 객체의 속성(attribute)에 사용자 식별자(UserId)를 설정한다. 이를 통해 후속 요청 핸들러에서 사용자 식별자에 접근할 수 있다.
  4. 반환값: preHandle 메서드는 true를 반환하여 요청을 계속 처리하도록 한다. 그러나 만약 JWT 디코딩에 실패한 경우(JWTDecodeException), AuthenticationError 예외를 던지면서 인증 오류를 알린다.
package kr.megaptera.F4T2.interceptors;

import com.auth0.jwt.exceptions.JWTDecodeException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import kr.megaptera.F4T2.exceptions.AuthenticationError;
import kr.megaptera.F4T2.models.UserId;
import kr.megaptera.F4T2.utils.JwtUtil;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.naming.AuthenticationException;

public class AuthenticationInterceptor implements HandlerInterceptor {
    private final JwtUtil jwtUtil;

    public AuthenticationInterceptor(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        String authorization = request.getHeader("Authorization");

        if (authorization == null || !authorization.startsWith("Bearer ")) {
            return true;
        }

        String accessToken = authorization.substring("Bearer ".length());

        try {
            UserId userId = jwtUtil.decode(accessToken);

            request.setAttribute("userId", userId);

            return true;
        } catch (JWTDecodeException exception) {
            throw new AuthenticationError();
        }
    }
}
profile
티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com

0개의 댓글