From 65c6684be8aad3c44961ea76a00790594cab4377 Mon Sep 17 00:00:00 2001 From: SCY Date: Fri, 28 Feb 2025 00:11:26 +0900 Subject: [PATCH] =?UTF-8?q?refac:=20filter=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=ED=98=95=ED=83=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/auth/jwt/AuthErrorCode.java | 1 + .../global/exception/dto/ErrorResponse.java | 10 +++++-- .../took/global/response/SuccessResponse.java | 3 ++ .../security/auth/AuthenticationFilter.java | 29 +++++++++++++++++-- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/evenly/took/global/exception/auth/jwt/AuthErrorCode.java b/src/main/java/com/evenly/took/global/exception/auth/jwt/AuthErrorCode.java index 7210d93..58129aa 100644 --- a/src/main/java/com/evenly/took/global/exception/auth/jwt/AuthErrorCode.java +++ b/src/main/java/com/evenly/took/global/exception/auth/jwt/AuthErrorCode.java @@ -14,6 +14,7 @@ public enum AuthErrorCode implements ErrorCode { OAUTH_TYPE_NOT_FOUND(HttpStatus.NOT_FOUND, "OAuth 타입을 찾을 수 없습니다."), JWT_UNAUTHORIZED(HttpStatus.UNAUTHORIZED, "JWT를 찾을 수 없습니다."), EXPIRED_REFRESH_TOKEN(HttpStatus.UNAUTHORIZED, "refresh token이 만료되었습니다."), + EXPIRED_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED, "access token이 만료되었습니다."), INVALID_ACCESS_TOKEN(HttpStatus.UNAUTHORIZED, "access token이 유효하지 않습니다."), ; diff --git a/src/main/java/com/evenly/took/global/exception/dto/ErrorResponse.java b/src/main/java/com/evenly/took/global/exception/dto/ErrorResponse.java index fa66b41..c3d3289 100644 --- a/src/main/java/com/evenly/took/global/exception/dto/ErrorResponse.java +++ b/src/main/java/com/evenly/took/global/exception/dto/ErrorResponse.java @@ -5,15 +5,19 @@ import org.springframework.http.HttpStatus; import com.evenly.took.global.exception.ErrorCode; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor public class ErrorResponse { - private final HttpStatus status; - private final String message; - private final LocalDateTime timestamp; + private HttpStatus status; + private String message; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime timestamp; protected ErrorResponse(ErrorCode errorCode) { this.status = errorCode.getStatus(); diff --git a/src/main/java/com/evenly/took/global/response/SuccessResponse.java b/src/main/java/com/evenly/took/global/response/SuccessResponse.java index 713ec27..5d47a93 100644 --- a/src/main/java/com/evenly/took/global/response/SuccessResponse.java +++ b/src/main/java/com/evenly/took/global/response/SuccessResponse.java @@ -4,6 +4,8 @@ import org.springframework.http.HttpStatus; +import com.fasterxml.jackson.annotation.JsonFormat; + import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -17,6 +19,7 @@ public class SuccessResponse { private final HttpStatus status; private final String message; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private final LocalDateTime timestamp; private final T data; diff --git a/src/main/java/com/evenly/took/global/security/auth/AuthenticationFilter.java b/src/main/java/com/evenly/took/global/security/auth/AuthenticationFilter.java index 63ef998..7f54114 100644 --- a/src/main/java/com/evenly/took/global/security/auth/AuthenticationFilter.java +++ b/src/main/java/com/evenly/took/global/security/auth/AuthenticationFilter.java @@ -1,14 +1,21 @@ package com.evenly.took.global.security.auth; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.List; +import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import com.evenly.took.feature.auth.api.HeaderHandler; import com.evenly.took.feature.auth.application.TokenProvider; +import com.evenly.took.global.exception.ErrorCode; import com.evenly.took.global.exception.TookException; +import com.evenly.took.global.exception.auth.jwt.AuthErrorCode; +import com.evenly.took.global.exception.dto.ErrorResponse; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -20,6 +27,7 @@ @RequiredArgsConstructor public class AuthenticationFilter extends OncePerRequestFilter { + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final List EXCLUDE_PATHS = List.of( "/swagger-ui", "/v3/api-docs", @@ -27,8 +35,12 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/health", "/api/oauth"); - private final TokenProvider tokenProvider; + static { + OBJECT_MAPPER.registerModule(new JavaTimeModule()); + } + private final HeaderHandler headerHandler; + private final TokenProvider tokenProvider; @Override protected boolean shouldNotFilter(HttpServletRequest request) { @@ -46,7 +58,8 @@ protected void doFilterInternal( checkTokens(request); filterChain.doFilter(request, response); } catch (TookException ex) { - response.sendError(HttpServletResponse.SC_UNAUTHORIZED, ex.getMessage()); // TODO 형식 통일 + AuthErrorCode errorCode = AuthErrorCode.EXPIRED_ACCESS_TOKEN; + sendError(response, errorCode); } } @@ -54,4 +67,16 @@ private void checkTokens(HttpServletRequest request) { String accessToken = headerHandler.resolveAccessToken(request); tokenProvider.validateAccessToken(accessToken); } + + private void sendError(HttpServletResponse response, ErrorCode errorCode) throws IOException { + response.setStatus(errorCode.getStatus().value()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding(StandardCharsets.UTF_8.displayName()); + String body = serialize(ErrorResponse.of(errorCode)); + response.getWriter().write(body); + } + + private String serialize(ErrorResponse responseBody) throws IOException { + return OBJECT_MAPPER.writeValueAsString(responseBody); + } }