728x90
320x100
🎯 오늘의 목표
- JWT 토큰이 없는데도 200 OK 가 뜨는 문제 해결하기
⚙️ 진행한 작업
- JwtAuthenticationFilter 수정하기
🛠️ 문제 상황
API 테스트를 하다보니까 분명 에러가 나야 하는 상황인데 200 OK 응답코드를 반환함 알고보니 JWT 토큰을 헤더에 넣지 않고 테스트를 해서 그런건데, 그럼 이런 상황에서는 401, 403이 떠야 정상인데 200 OK를 반환 하고 있어 이를 수정해보려 함. 그대로 둔다면 문제상황이 발생했을 때 디버깅 하기가 아주 어려워지기 때문에...!
📌 JwtAuthenticationFilter
- 문제는 JwtAuthenticationFilter.Java였는데 코드를 살펴보면 유효하지 않은 토큰이든, 토큰이 없든 예외도 없고 그냥 컨트롤러로 넘어감. 결국 Spring Security는 아무 인증 없이 컨트롤러를 실행시키고, 그 안에서 userDetails가 null이라 응답도 이상하게 나오게 된다.
if (authHeader != null && authHeader.startsWith("Bearer ")) {
String token = authHeader.substring(7);
if (jwtUtil.validateToken(token)) {
// 사용자 인증 처리...
}
}
filterChain.doFilter(request, response); // ✅ 항상 필터 통과
📌 JwtAuthenticationFilter 수정
아래와 같이 수정해서 명확한 응답코드와 메시지를 주도록 수정함!
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String authHeader = request.getHeader("Authorization");
// Authorization 헤더 없음 or 잘못된 형식 → 그냥 다음 필터로 넘김
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
filterChain.doFilter(request, response);
return;
}
String token = authHeader.substring(7);
if (blacklistService.isBlacklisted(token)) {
reject(response, "Token is blacklisted");
return;
}
if (!jwtUtil.validateToken(token)) {
reject(response, "Invalid or expired token");
return;
}
String email = jwtUtil.getEmailFromToken(token);
User user = userRepository.findByEmail(email).orElse(null);
if (user == null) {
reject(response, "User not found");
return;
}
CustomUserDetails customUserDetails = new CustomUserDetails(user);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(customUserDetails, null, customUserDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
filterChain.doFilter(request, response);
}
private void reject(HttpServletResponse response, String message) throws IOException {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setContentType("application/json; charset=UTF-8");
response.getWriter().write("{\"success\":false,\"code\":\"UNAUTHORIZED\",\"message\":\"" + message + "\"}");
}
728x90
320x100
'💻 뚝딱뚝딱 > 북북클럽' 카테고리의 다른 글
[개발일지 #026] 신고(Report) 도메인 구현 및 단위테스트 (0) | 2025.05.01 |
---|---|
[개발일지 #025] 좋아요(Like) 토글 기능으로 변경하기 (0) | 2025.05.01 |
[개발일지 #023] 댓글(Comment) API 구현 및 테스트 (0) | 2025.04.30 |
[개발일지 #022] 댓글(Comment) 도메인 구현 및 단위테스트 (0) | 2025.04.30 |
[개발일지 #021] 좋아요(Like) 도메인 API 구현 및 테스트 (0) | 2025.04.30 |