From a5291db70c306507835be2611b1a9722de9a24e3 Mon Sep 17 00:00:00 2001 From: chanwoo7 Date: Fri, 16 Aug 2024 22:31:37 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[chore]=20API=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/JwtAuthenticationFilter.java | 8 +++++++- .../java/com/book/backend/exception/ErrorCode.java | 3 ++- .../exception/ExceptionHandlerResponse.java | 7 ++++--- .../global/CustomAuthenticationEntryPoint.java | 4 ++-- .../com/book/backend/global/ResponseTemplate.java | 14 +++++++------- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/book/backend/domain/auth/service/JwtAuthenticationFilter.java b/src/main/java/com/book/backend/domain/auth/service/JwtAuthenticationFilter.java index 40c15095..d5eb9654 100644 --- a/src/main/java/com/book/backend/domain/auth/service/JwtAuthenticationFilter.java +++ b/src/main/java/com/book/backend/domain/auth/service/JwtAuthenticationFilter.java @@ -4,6 +4,7 @@ import com.book.backend.exception.ErrorCode; import com.book.backend.util.JwtUtil; import com.book.backend.util.RequestWrapper; +import io.jsonwebtoken.ExpiredJwtException; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -45,7 +46,12 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse if (authorization != null && authorization.startsWith("Bearer ")) { // Bearer 토큰 파싱 token = authorization.substring(7); // jwt token 파싱 - username = jwtUtil.getUsernameFromToken(token); // username 가져옴 + try { + username = jwtUtil.getUsernameFromToken(token); // username 가져옴 + } catch (ExpiredJwtException e) { + filterChain.doFilter(wrappedRequest, response); + return; + } // 현재 SecurityContextHolder에 인증객체가 있는지 확인 if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { diff --git a/src/main/java/com/book/backend/exception/ErrorCode.java b/src/main/java/com/book/backend/exception/ErrorCode.java index 741a6ac5..d259e288 100644 --- a/src/main/java/com/book/backend/exception/ErrorCode.java +++ b/src/main/java/com/book/backend/exception/ErrorCode.java @@ -22,7 +22,8 @@ public enum ErrorCode { INVALID_PAGE_NUM(HttpStatus.BAD_REQUEST, "400", "페이지 번호는 1 이상의 숫자로 입력해주세요."), INVALID_CREDENTIALS(HttpStatus.UNAUTHORIZED, "401", "사용자 인증에 실패했습니다."), - LOGIN_REQUIRED(HttpStatus.FORBIDDEN, "403", "로그인이 필요합니다."), + LOGIN_REQUIRED(HttpStatus.UNAUTHORIZED, "401", "로그인이 필요합니다."), + JWT_EXPIRED(HttpStatus.UNAUTHORIZED, "401", "JWT 토큰이 만료되었습니다. 다시 로그인해주세요."), USER_NOT_FOUND(HttpStatus.NOT_FOUND, "404", "해당하는 사용자를 찾을 수 없습니다."), LOGIN_ID_DUPLICATED(HttpStatus.CONFLICT,"409", "사용자의 아이디가 중복됩니다."), BAD_REQUEST(HttpStatus.BAD_REQUEST, "400", "요청이 잘못되었습니다."), diff --git a/src/main/java/com/book/backend/exception/ExceptionHandlerResponse.java b/src/main/java/com/book/backend/exception/ExceptionHandlerResponse.java index d72c2907..1953254b 100644 --- a/src/main/java/com/book/backend/exception/ExceptionHandlerResponse.java +++ b/src/main/java/com/book/backend/exception/ExceptionHandlerResponse.java @@ -1,7 +1,8 @@ package com.book.backend.exception; import com.book.backend.global.ResponseTemplate; -import java.util.HashMap; +import java.util.LinkedHashMap; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -15,13 +16,13 @@ public class ExceptionHandlerResponse { // 유효성 검사 실패 시 BAD_REQUEST 로 반환 @ExceptionHandler(CustomException.class) - public ResponseEntity> handleCustomException(CustomException e) { + public ResponseEntity> handleCustomException(CustomException e) { return responseTemplate.fail(e, HttpStatus.BAD_REQUEST); } // 다른 예외 발생 시 내부 서버 오류 반환 @ExceptionHandler(Exception.class) - public ResponseEntity> handleException(Exception e) { + public ResponseEntity> handleException(Exception e) { return responseTemplate.fail(e, HttpStatus.INTERNAL_SERVER_ERROR); } } diff --git a/src/main/java/com/book/backend/global/CustomAuthenticationEntryPoint.java b/src/main/java/com/book/backend/global/CustomAuthenticationEntryPoint.java index c8287e50..965486d7 100644 --- a/src/main/java/com/book/backend/global/CustomAuthenticationEntryPoint.java +++ b/src/main/java/com/book/backend/global/CustomAuthenticationEntryPoint.java @@ -18,8 +18,8 @@ public void commence(HttpServletRequest request, HttpServletResponse response, A response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); response.getWriter().write( - "{\"error\": \"" + customException.getCode().getMessage() + "\", " + - "\"code\": \"" + customException.getCode().getCode() + "\"}"); + "{\"statusCode\": \"" + customException.getCode().getCode() + "\", " + + "\"message\": \"" + customException.getCode().getMessage() + "\"}"); response.getWriter().flush(); } } diff --git a/src/main/java/com/book/backend/global/ResponseTemplate.java b/src/main/java/com/book/backend/global/ResponseTemplate.java index 2bf6ec62..b20d0030 100644 --- a/src/main/java/com/book/backend/global/ResponseTemplate.java +++ b/src/main/java/com/book/backend/global/ResponseTemplate.java @@ -1,12 +1,12 @@ package com.book.backend.global; import java.util.HashMap; -import lombok.AllArgsConstructor; +import java.util.LinkedHashMap; + import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Component @@ -15,17 +15,17 @@ public class ResponseTemplate { // 성공 response 템플릿 - public ResponseEntity> success(Object message, HttpStatus status) { - HashMap response = new HashMap<>(); + public ResponseEntity> success(Object message, HttpStatus status) { + LinkedHashMap response = new LinkedHashMap<>(); response.put("statusCode", status.value()); - response.put("message", message); + response.put("data", message); return new ResponseEntity<>(response, status); } // 예외 response 템플릿 - public ResponseEntity> fail(Exception e, HttpStatus status){ - HashMap response = new HashMap<>(); + public ResponseEntity> fail(Exception e, HttpStatus status){ + LinkedHashMap response = new LinkedHashMap<>(); response.put("statusCode", status.value()); response.put("message", e.getMessage()); From a25a63e4224be392868b7f6ab48ef0117ad7a251 Mon Sep 17 00:00:00 2001 From: chanwoo7 Date: Fri, 16 Aug 2024 22:39:18 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[chore]=20AuthController=EC=97=90=20Reponse?= =?UTF-8?q?Template=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/auth/controller/AuthController.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/book/backend/domain/auth/controller/AuthController.java b/src/main/java/com/book/backend/domain/auth/controller/AuthController.java index 283d2fff..82e335b3 100644 --- a/src/main/java/com/book/backend/domain/auth/controller/AuthController.java +++ b/src/main/java/com/book/backend/domain/auth/controller/AuthController.java @@ -23,6 +23,8 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import java.util.LinkedHashMap; + @RestController @RequestMapping("/api/auth") @RequiredArgsConstructor @@ -37,11 +39,11 @@ public class AuthController { responses = {@ApiResponse(responseCode = "201", content = @Content(schema = @Schema(implementation = UserDto.class)), description = UserDto.description)}) @PostMapping("/signup") - public ResponseEntity signup(@Valid @RequestBody SignupDto signupDto) { + public ResponseEntity signup(@Valid @RequestBody SignupDto signupDto) { RequestLogger.body(signupDto); UserDto userDto = authService.signup(signupDto); - return ResponseEntity.ok(userDto); + return responseTemplate.success(userDto, HttpStatus.CREATED); } @Operation(summary = "로그인", description = "기본 로그인을 진행합니다.", @@ -52,7 +54,7 @@ public ResponseEntity login(@Valid @RequestBody LoginDto loginDto) { RequestLogger.body(loginDto); LoginSuccessResponseDto loginSuccessResponseDto = authService.login(loginDto); - return ResponseEntity.ok(loginSuccessResponseDto); + return responseTemplate.success(loginSuccessResponseDto, HttpStatus.OK); } // @PostMapping("/logout") @@ -71,7 +73,7 @@ public ResponseEntity deleteAccount() { authService.deleteAccountByLoginId(loginId); SecurityContextHolder.clearContext(); - return new ResponseEntity<>(HttpStatus.NO_CONTENT); + return responseTemplate.success("회원 탈퇴가 완료되었습니다.", HttpStatus.NO_CONTENT); } @Operation(summary = "카카오 로그인", description = "사용자가 카카오 인증 서버에서 받은 인가 코드를 parameter로 받아 카카오계정으로 로그인을 진행하고, 완료된 유저 정보를 반환합니다.",