Skip to content

Commit cf9bc91

Browse files
authored
Merge pull request #31 from prgrms-web-devcourse-final-project/fix/token/1
[fix] : validateToken 원상복구 - 토큰 검증 로직 오류 수정
2 parents b5588f2 + 1fd7cb7 commit cf9bc91

File tree

2 files changed

+57
-30
lines changed

2 files changed

+57
-30
lines changed

src/main/java/org/dfbf/soundlink/global/auth/JwtAuthenticationFilter.java

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,63 +10,88 @@
1010
import lombok.RequiredArgsConstructor;
1111
import org.dfbf.soundlink.global.exception.ErrorCode;
1212
import org.dfbf.soundlink.global.exception.ResponseResult;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
1315
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
1416
import org.springframework.security.core.context.SecurityContextHolder;
17+
import org.springframework.stereotype.Component;
1518
import org.springframework.web.filter.OncePerRequestFilter;
1619

1720
import java.io.IOException;
1821

22+
@Component
1923
@RequiredArgsConstructor
2024
public class JwtAuthenticationFilter extends OncePerRequestFilter {
25+
2126
private final JwtProvider jwtProvider;
2227
private final ObjectMapper objectMapper = new ObjectMapper();
2328

29+
private static final Logger logger = LoggerFactory.getLogger(JwtAuthenticationFilter.class);
30+
2431
@Override
2532
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
2633
throws ServletException, IOException {
27-
String accessToken = jwtProvider.resolveAccessToken(request); //1.Access Token 추출
34+
35+
String accessToken = jwtProvider.resolveAccessToken(request); // 1. Access Token 추출
36+
logger.info("Extracted Access Token: {}", accessToken);
2837

2938
try {
30-
if(accessToken !=null && jwtProvider.validateToken(accessToken)) { //2.유효성 검사
31-
this.setAuthentication(accessToken); //3.유저정보 저장
32-
}
33-
filterChain.doFilter(request, response); //필터 체인 진행(전달)
39+
if (accessToken != null && jwtProvider.validateToken(accessToken)) { // 2. 유효성 검사
40+
logger.info("Valid JWT Token found, setting authentication.");
41+
setAuthentication(accessToken); // 3. 유저 정보 저장
42+
} else {
43+
logger.warn("Invalid JWT Token or token is null");
44+
}
3445
} catch (ExpiredJwtException e) {
35-
handleException(response, ErrorCode.TOKEN_EXPIRED);
46+
logger.error("Expired JWT Token: {}", e.getMessage(), e); // 토큰 만료 예외 처리
47+
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
48+
response.setContentType("application/json");
49+
response.setCharacterEncoding("UTF-8");
50+
response.getWriter().write(objectMapper.writeValueAsString(new ResponseResult(ErrorCode.TOKEN_EXPIRED)));
51+
return;
3652
} catch (JwtException e) {
37-
handleException(response, ErrorCode.TOKEN_INVALID);
38-
}catch (Exception e) {
39-
handleException(response, ErrorCode.INTERNAL_SERVER_ERROR);
53+
logger.error("Invalid JWT Token: {}", e.getMessage(), e); // 유효하지 않은 토큰 예외 처리
54+
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
55+
response.setContentType("application/json");
56+
response.setCharacterEncoding("UTF-8");
57+
response.getWriter().write(objectMapper.writeValueAsString(new ResponseResult(ErrorCode.TOKEN_INVALID)));
58+
return;
59+
} catch (IllegalArgumentException e) {
60+
logger.error("Illegal Argument Exception: {}", e.getMessage(), e); // 잘못된 인자 예외 처리
61+
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
62+
response.setContentType("application/json");
63+
response.setCharacterEncoding("UTF-8");
64+
response.getWriter().write(objectMapper.writeValueAsString(new ResponseResult(ErrorCode.INTERNAL_SERVER_ERROR)));
65+
return;
66+
} catch (Exception e) {
67+
logger.error("Unexpected error during token validation: {}", e.getMessage(), e); // 예상치 못한 예외 처리
68+
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "서버 오류가 발생했습니다.");
69+
return;
4070
}
41-
}
4271

72+
logger.info("Proceeding with filter chain.");
73+
filterChain.doFilter(request, response); // 필터 체인 진행
74+
}
4375

44-
//유저정보 저장
76+
// 유저 정보 저장
4577
public void setAuthentication(String token) {
46-
Long userId = jwtProvider.getUserId(token); //userId 추출
78+
Long userId = jwtProvider.getUserId(token); // userId 추출
79+
logger.info("Extracted userId from JWT: {}", userId);
4780

4881
if (userId == null) {
82+
logger.error("userId cannot be null");
4983
throw new IllegalArgumentException("userId cannot be null");
5084
}
5185

5286
CustomUserDetails userDetails = new CustomUserDetails(userId);
87+
logger.info("UserDetails created for userId: {}", userId);
5388

54-
// 인증토큰 생성
89+
// 인증 토큰 생성
5590
UsernamePasswordAuthenticationToken authentication =
5691
new UsernamePasswordAuthenticationToken(userId, null, userDetails.getAuthorities());
5792

58-
// 인증정보 설정
93+
// 인증 정보 설정
5994
SecurityContextHolder.getContext().setAuthentication(authentication);
95+
logger.info("Authentication set for userId: {}", userId);
6096
}
61-
62-
// 예외 발생 시 JSON 응답을 반환하는 메서드
63-
private void handleException(HttpServletResponse response, ErrorCode errorCode) throws IOException {
64-
ResponseResult responseResult = new ResponseResult(errorCode);
65-
66-
response.setStatus(errorCode.getStatus().value());
67-
response.setContentType("application/json");
68-
response.setCharacterEncoding("UTF-8");
69-
response.getWriter().write(objectMapper.writeValueAsString(responseResult));
70-
}
71-
7297
}

src/main/java/org/dfbf/soundlink/global/auth/JwtProvider.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
import io.jsonwebtoken.security.SignatureException;
66
import jakarta.servlet.http.Cookie;
77
import jakarta.servlet.http.HttpServletRequest;
8+
import org.dfbf.soundlink.domain.user.exception.ExpiredTokenException;
9+
import org.dfbf.soundlink.global.exception.ErrorCode;
10+
import org.dfbf.soundlink.global.exception.ResponseResult;
811
import org.springframework.beans.factory.annotation.Autowired;
912
import org.springframework.beans.factory.annotation.Value;
1013
import org.springframework.data.redis.core.RedisTemplate;
@@ -71,15 +74,14 @@ public boolean validateToken(String token){
7174
.build()
7275
.parseClaimsJws(token); //토큰 유효한지 확인.
7376
return true;
74-
}catch (ExpiredJwtException e) {
75-
throw e; // 만료된 토큰 예외 그대로 던짐
76-
} catch (JwtException e) {
77-
throw e; // 기타 JWT 관련 예외도 그대로 던짐
7877
} catch (Exception e) {
79-
throw new RuntimeException("서버 내부 오류 발생", e);
78+
System.out.println("[ERROR] Token validation failed: ");
79+
return false;
8080
}
8181
}
8282

83+
84+
8385
//액세스토큰 추출
8486
public String resolveAccessToken(HttpServletRequest request) {
8587
String bearerToken = request.getHeader("Authorization"); //토큰을 헤더에 포함했는지

0 commit comments

Comments
 (0)