Skip to content

Commit 9271e29

Browse files
committed
feat(JwtExceptionFilter): JWT 예외 처리 필터 구현
- JWT 처리 중 발생하는 JwtException을 전용 필터에서 처리 (스프링 컨텍스트가 아니므로) - HTTP 상태 코드 401(Unauthorized)와 함께 ProblemDetail 형식의 JSON 응답 생성 - ProblemDetail 응답에 오류 제목, 유형, 상세 메시지, 타임스탬프 포함
1 parent a7c91e7 commit 9271e29

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.somemore.auth.jwt.filter;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.somemore.auth.jwt.exception.JwtException;
5+
import jakarta.servlet.FilterChain;
6+
import jakarta.servlet.ServletException;
7+
import jakarta.servlet.http.HttpServletRequest;
8+
import jakarta.servlet.http.HttpServletResponse;
9+
import lombok.RequiredArgsConstructor;
10+
import lombok.extern.slf4j.Slf4j;
11+
import org.springframework.http.HttpStatus;
12+
import org.springframework.http.MediaType;
13+
import org.springframework.http.ProblemDetail;
14+
import org.springframework.stereotype.Component;
15+
import org.springframework.web.filter.OncePerRequestFilter;
16+
17+
import java.io.IOException;
18+
import java.net.URI;
19+
20+
@RequiredArgsConstructor
21+
@Slf4j
22+
@Component
23+
public class JwtExceptionFilter extends OncePerRequestFilter {
24+
25+
private final ObjectMapper objectMapper;
26+
27+
@Override
28+
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
29+
try {
30+
filterChain.doFilter(request, response);
31+
} catch (JwtException e) {
32+
ProblemDetail problemDetail = buildUnauthorizedProblemDetail(e);
33+
configureUnauthorizedResponse(response);
34+
35+
objectMapper.writeValue(response.getWriter(), problemDetail);
36+
}
37+
}
38+
39+
private void configureUnauthorizedResponse(HttpServletResponse response) {
40+
response.setStatus(HttpStatus.UNAUTHORIZED.value());
41+
response.setContentType(MediaType.APPLICATION_PROBLEM_JSON_VALUE);
42+
response.setCharacterEncoding("UTF-8");
43+
}
44+
45+
private ProblemDetail buildUnauthorizedProblemDetail(JwtException e) {
46+
ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.UNAUTHORIZED, e.getMessage());
47+
problemDetail.setTitle("Authentication Error");
48+
problemDetail.setType(URI.create("http://프론트엔드주소/errors/unauthorized"));
49+
problemDetail.setProperty("timestamp", System.currentTimeMillis());
50+
return problemDetail;
51+
}
52+
}

0 commit comments

Comments
 (0)