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