diff --git a/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java b/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java index 7e98f00..3464bd7 100644 --- a/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/com/example/be/apiPayload/code/status/ErrorStatus.java @@ -21,7 +21,8 @@ public enum ErrorStatus implements BaseErrorCode { //로그인 관련 에러 _NOT_FOUND_USER(HttpStatus.NOT_FOUND, "USER401", "해당 유저를 찾을 수 없습니다."), _EXIST_EMAIL(HttpStatus.BAD_REQUEST, "USER402", "중복된 이메일입니다."), - _NOT_CORRECT_PASSWORD(HttpStatus.BAD_REQUEST, "USER405", "비밀번호가 틀립니다.") + _NOT_CORRECT_PASSWORD(HttpStatus.BAD_REQUEST, "USER405", "비밀번호가 틀립니다."), + _NOT_FOUND_COOKIE(HttpStatus.NOT_FOUND, "USER403", "쿠키가 없습니다.") ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/example/be/service/JwtUtilServiceImpl.java b/src/main/java/com/example/be/service/JwtUtilServiceImpl.java index 8cc49cc..8bfb02a 100644 --- a/src/main/java/com/example/be/service/JwtUtilServiceImpl.java +++ b/src/main/java/com/example/be/service/JwtUtilServiceImpl.java @@ -12,6 +12,8 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -107,5 +109,18 @@ public boolean isTokenExpired(String token) { log.warn("유효하지 않은 토큰입니다."); throw new TokenException(TokenErrorResult.INVALID_TOKEN); } + + } + public String extractTokenFromCookie(HttpServletRequest request, String cookieName) { + Cookie[] cookies = request.getCookies(); + if(cookies != null) { + for(Cookie cookie : cookies) { + if(cookie.getName().equals(cookieName)) { + return cookie.getValue(); + } + } + } + throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE); } + } \ No newline at end of file diff --git a/src/main/java/com/example/be/service/UserServiceImpl.java b/src/main/java/com/example/be/service/UserServiceImpl.java index 6724ad8..7786098 100644 --- a/src/main/java/com/example/be/service/UserServiceImpl.java +++ b/src/main/java/com/example/be/service/UserServiceImpl.java @@ -10,6 +10,7 @@ import com.example.be.web.dto.CommonDTO; import com.example.be.web.dto.UserDTO; import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -104,4 +105,48 @@ public CommonDTO.IsSuccessDTO login(UserDTO.LoginRequestDto request, HttpServlet .isSuccess(true) .build(); } + + public UserDTO.UserResponseDto getUserInfo(String accessToken) { + // 토큰이 없는 경우 처리 + if(accessToken == null) { + throw new UserHandler(ErrorStatus._NOT_FOUND_USER); + } + + // 토큰에서 사용자 ID 추출 + String userId = jwtUtil.getUserIdFromToken(accessToken); + + // 사용자 정보 조회 + User user = userRepository.findByUserId(UUID.fromString(userId)) + .orElseThrow(() -> new UserHandler(ErrorStatus._NOT_FOUND_USER)); + + // UserResponseDto로 변환하여 반환 + return UserDTO.UserResponseDto.builder() + .userId(user.getId()) + .userName(user.getName()) + .email(user.getEmail()) + .loginType(user.getProvider()) + .build(); + } + public CommonDTO.IsSuccessDTO logout(HttpServletResponse response, HttpServletRequest request) { + Cookie[] cookies = request.getCookies(); + + if(cookies == null) { + throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE); + } + + Cookie access = new Cookie("accessToken", null); + Cookie refresh = new Cookie("refreshToken", null); + + access.setPath("/"); + refresh.setPath("/"); + + access.setMaxAge(0); + refresh.setMaxAge(0); + + response.addCookie(access); + response.addCookie(refresh); + + return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build(); + } + } diff --git a/src/main/java/com/example/be/web/controller/UserController.java b/src/main/java/com/example/be/web/controller/UserController.java index 7a71368..8f9eba0 100644 --- a/src/main/java/com/example/be/web/controller/UserController.java +++ b/src/main/java/com/example/be/web/controller/UserController.java @@ -3,94 +3,50 @@ import com.example.be.apiPayload.ApiResponse; import com.example.be.apiPayload.code.status.ErrorStatus; import com.example.be.apiPayload.exception.handler.UserHandler; -import com.example.be.domain.User; -import com.example.be.repository.UserRepository; import com.example.be.service.JwtUtilServiceImpl; import com.example.be.service.UserServiceImpl; import com.example.be.web.dto.CommonDTO; import com.example.be.web.dto.UserDTO; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; -import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; -import org.springframework.boot.actuate.autoconfigure.metrics.SystemMetricsAutoConfiguration; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.UUID; - @RestController @RequestMapping("/user") @RequiredArgsConstructor public class UserController { private final UserServiceImpl userService; - private final SystemMetricsAutoConfiguration systemMetricsAutoConfiguration; - private final JwtUtilServiceImpl jwtUtilServiceImpl; - private final UserRepository userRepository; - - @Hidden - @GetMapping("/socialLogin") - public ResponseEntity handleLoginRedirect( - @RequestParam String name, - @RequestParam String access_token, - @RequestParam String refresh_token) { - - return ResponseEntity.ok("로그인 성공"); - } + private final JwtUtilServiceImpl jwtUtilService; @PostMapping("/signup") @Operation(summary = "회원가입 API") public ApiResponse signup(@RequestBody UserDTO.SingUpRequestDto request) { - return ApiResponse.onSuccess(userService.signUp(request)); } @PostMapping("/login") @Operation(summary = "로그인 API") public ApiResponse login(@RequestBody UserDTO.LoginRequestDto request, HttpServletResponse response) { - return ApiResponse.onSuccess(userService.login(request, response)); } @PostMapping("/info") @Operation(summary = "유저 정보 반환 API") public ApiResponse userInfo(HttpServletRequest request) { - String accessToken = null; - Cookie[] cookies = request.getCookies(); - - if(cookies != null) { - for(Cookie cookie : cookies) { - if(cookie.getName().equals("accessToken")) { - accessToken = cookie.getValue(); - } - } - } - System.out.println(accessToken); + // 쿠키에서 액세스 토큰 추출은 서비스로 이동 + String accessToken = jwtUtilService.extractTokenFromCookie(request, "accessToken"); - // 토큰이 없는 경우 처리 - if(accessToken == null) { - throw new UserHandler(ErrorStatus._NOT_FOUND_USER); - } - - // 토큰에서 사용자 ID 추출 - String userId = jwtUtilServiceImpl.getUserIdFromToken(accessToken); - - // 사용자 정보 조회 - User user = userRepository.findByUserId(UUID.fromString(userId)) - .orElseThrow(() -> new UserHandler(ErrorStatus._NOT_FOUND_USER)); - - // UserResponseDto로 변환하여 반환 - UserDTO.UserResponseDto userResponseDto = UserDTO.UserResponseDto.builder() - .userId(user.getId()) - .userName(user.getName()) - .email(user.getEmail()) - .loginType(user.getProvider()) - .build(); - - return ApiResponse.onSuccess(userResponseDto); } + // 사용자 정보 조회 로직도 서비스로 이동 + return ApiResponse.onSuccess(userService.getUserInfo(accessToken)); + } -} + @PostMapping("/logout") + @Operation(summary = "로그아웃 API") + public ApiResponse logout(HttpServletResponse response, HttpServletRequest request) { + return ApiResponse.onSuccess(userService.logout(response, request)); + } +} \ No newline at end of file