From e0577fdcfa2744b041e1042a7a239bbe3fe57f17 Mon Sep 17 00:00:00 2001 From: "PARK, Yeonjong" Date: Wed, 30 Jul 2025 20:06:55 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20=EB=A6=AC=ED=94=84=EB=A0=88=EC=8B=9C?= =?UTF-8?q?=20=ED=86=A0=ED=81=B0=20API=20=EC=A0=91=EA=B7=BC=20=EC=8B=9C=20?= =?UTF-8?q?JWT=20=ED=95=84=ED=84=B0=EB=A5=BC=20=EA=B1=B0=EC=B9=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/SecurityConfig.java | 4 ---- .../global/exception/ExceptionType.java | 2 +- .../exception/GlobalExceptionHandler.java | 22 ++++++++++++++++--- .../jwt/filter/JwtAuthenticationFilter.java | 2 +- src/main/resources/properties | 2 +- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/config/security/SecurityConfig.java b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/config/security/SecurityConfig.java index aace6d15..7ab3217e 100644 --- a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/config/security/SecurityConfig.java +++ b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/config/security/SecurityConfig.java @@ -51,10 +51,6 @@ public SecurityFilterChain defaultSecurity(HttpSecurity http) throws Exception { // @PreAuthorized, @PostAuthorized의 경우 메서드 호출 직전에 차단되어 GlobalExceptionHandler에 의해 예외가 처리됩니다. .authorizeHttpRequests(req -> req .requestMatchers("/api/v1/admin/**").hasAnyRole(MemberType.ADMIN.name()) - .requestMatchers("/api/v1/members/sign-in").permitAll() - .requestMatchers("/api/v1/members/sign-up/**").permitAll() - .requestMatchers("/api/v1/members/refresh").permitAll() - .requestMatchers("/api/v1/email/**").permitAll() .anyRequest().permitAll()) .exceptionHandling(ex -> ex diff --git a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/ExceptionType.java b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/ExceptionType.java index bb102baa..8445a30b 100644 --- a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/ExceptionType.java +++ b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/ExceptionType.java @@ -12,7 +12,7 @@ public enum ExceptionType { // Common UNEXPECTED_SERVER_ERROR(INTERNAL_SERVER_ERROR,"C001","예상치 못한 서버 오류가 발생했습니다."), BINDING_ERROR(BAD_REQUEST,"C002","요청 데이터 변환 과정에서 오류가 발생했습니다."), - ESSENTIAL_FIELD_MISSING_ERROR(NO_CONTENT , "C003","필수 필드를 누락했습니다."), + ESSENTIAL_FIELD_MISSING_ERROR(BAD_REQUEST , "C003","필수 필드를 누락했습니다."), INVALID_ENDPOINT(NOT_FOUND, "C004", "잘못된 API URI로 요청했습니다."), INVALID_HTTP_METHOD(METHOD_NOT_ALLOWED, "C005","잘못된 HTTP 메서드로 요청했습니다."), diff --git a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/GlobalExceptionHandler.java b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/GlobalExceptionHandler.java index 05d2f73c..58ed1991 100644 --- a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/exception/GlobalExceptionHandler.java @@ -12,6 +12,8 @@ import org.springframework.security.authentication.AuthenticationCredentialsNotFoundException; import org.springframework.web.HttpRequestMethodNotSupportedException; import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingRequestCookieException; +import org.springframework.web.bind.MissingRequestHeaderException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.resource.NoResourceFoundException; @@ -38,7 +40,7 @@ public ResponseEntity> handleMethodArgumentNotValidException( @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - log.error("HttpMessageNotReadableException : {}", e); + log.error("HttpMessageNotReadableException : {}", e.getMessage()); return ResponseEntity .status(ExceptionType.BINDING_ERROR.getStatus()) .body(ResponseUtil.createFailureResponse(ExceptionType.BINDING_ERROR)); @@ -60,7 +62,7 @@ public ResponseEntity> handleNotFound(NoResourceFoundExceptio @ExceptionHandler(AccessDeniedException.class) public ResponseEntity> handleAccessDeniedException(AccessDeniedException e) { - log.error("AccessDeniedException : {}", e); + log.error("AccessDeniedException : {}", e.getMessage()); return ResponseEntity .status(ExceptionType.ACCESS_DENIED.getStatus()) .body(ResponseUtil.createFailureResponse(ExceptionType.ACCESS_DENIED)); @@ -73,9 +75,23 @@ public ResponseEntity> handleAuthenticationCredentialsNotFoun .body(ResponseUtil.createFailureResponse(ExceptionType.NEED_AUTHORIZED)); } + @ExceptionHandler(MissingRequestHeaderException.class) + public ResponseEntity> handleMissingRequestHeaderException(MissingRequestHeaderException e) { + return ResponseEntity + .status(ExceptionType.ESSENTIAL_FIELD_MISSING_ERROR.getStatus()) + .body(ResponseUtil.createFailureResponse(ExceptionType.ESSENTIAL_FIELD_MISSING_ERROR, "필수 HTTP 헤더가 존재하지 않습니다.")); + } + + @ExceptionHandler(MissingRequestCookieException.class) + public ResponseEntity> handleMissingRequestCookieException(MissingRequestCookieException e) { + return ResponseEntity + .status(ExceptionType.ESSENTIAL_FIELD_MISSING_ERROR.getStatus()) + .body(ResponseUtil.createFailureResponse(ExceptionType.ESSENTIAL_FIELD_MISSING_ERROR, "필수 쿠키가 존재하지 않습니다.")); + } + @ExceptionHandler(Exception.class) public ResponseEntity> handleException(Exception e){ - log.error("unhandle error : {}", e); + log.error("Unhandled exception : ", e); return ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) .body(ResponseUtil.createFailureResponse(ExceptionType.UNEXPECTED_SERVER_ERROR)); diff --git a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/jwt/filter/JwtAuthenticationFilter.java b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/jwt/filter/JwtAuthenticationFilter.java index c92044c0..35e8108c 100644 --- a/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/jwt/filter/JwtAuthenticationFilter.java +++ b/src/main/java/kr/ac/kumoh/d138/JobForeigner/global/jwt/filter/JwtAuthenticationFilter.java @@ -30,7 +30,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { @Override protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { - String[] excludePath = {"api/v1/members/sign-in", "api/v1/members/sign-up/**", "api/v1/members/refresh", "api/v1/email/**"}; + String[] excludePath = {"/api/v1/members/sign-in", "/api/v1/members/sign-up/**", "/api/v1/members/refresh", "/api/v1/email/**"}; String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION); return authorizationHeader == null diff --git a/src/main/resources/properties b/src/main/resources/properties index 11b82a2a..38ec4970 160000 --- a/src/main/resources/properties +++ b/src/main/resources/properties @@ -1 +1 @@ -Subproject commit 11b82a2a0896e10014297d2e7b1dad832d2973f1 +Subproject commit 38ec49702a8ccad0c17c10ef20f6e2143c7e3ff5