Skip to content

Commit

Permalink
refac: filter 에러 응답 형태 통일
Browse files Browse the repository at this point in the history
  • Loading branch information
helenason committed Feb 27, 2025
1 parent bfc7fbc commit 65c6684
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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이 유효하지 않습니다."),
;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import org.springframework.http.HttpStatus;

import com.fasterxml.jackson.annotation.JsonFormat;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand All @@ -17,6 +19,7 @@ public class SuccessResponse<T> {

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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -20,15 +27,20 @@
@RequiredArgsConstructor
public class AuthenticationFilter extends OncePerRequestFilter {

private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final List<String> EXCLUDE_PATHS = List.of(
"/swagger-ui",
"/v3/api-docs",
"/public",
"/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) {
Expand All @@ -46,12 +58,25 @@ 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);
}
}

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);
}
}

0 comments on commit 65c6684

Please sign in to comment.