From ae3541b5667f1177425c69e49bfe5b84c6f2c7f6 Mon Sep 17 00:00:00 2001 From: soyeonkim8888 Date: Thu, 11 Sep 2025 01:23:19 +0900 Subject: [PATCH] =?UTF-8?q?Revert=20"[#91]feat:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20?= =?UTF-8?q?=EB=B0=8F=20=ED=86=A0=ED=81=B0=20=EB=B8=94=EB=9E=99=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 4 - .../com/issueDive/config/RedisConfig.java | 57 -------- .../issueDive/controller/AuthController.java | 135 ++---------------- .../java/com/issueDive/dto/JwtResponse.java | 2 - .../issueDive/dto/RefreshTokenRequest.java | 12 -- .../com/issueDive/entity/RefreshToken.java | 43 ------ .../repository/RefreshTokenRepository.java | 30 ---- .../security/JwtAuthenticationFilter.java | 10 -- .../service/TokenBlacklistService.java | 56 -------- src/main/java/com/issueDive/util/JwtUtil.java | 18 --- .../controller/AuthControllerTest.java | 25 +--- .../exception/GlobalExceptionHandlerTest.java | 4 - .../service/TokenBlacklistServiceTest.java | 64 --------- 13 files changed, 10 insertions(+), 450 deletions(-) delete mode 100644 src/main/java/com/issueDive/config/RedisConfig.java delete mode 100644 src/main/java/com/issueDive/dto/RefreshTokenRequest.java delete mode 100644 src/main/java/com/issueDive/entity/RefreshToken.java delete mode 100644 src/main/java/com/issueDive/repository/RefreshTokenRepository.java delete mode 100644 src/main/java/com/issueDive/service/TokenBlacklistService.java delete mode 100644 src/test/java/com/issueDive/service/TokenBlacklistServiceTest.java diff --git a/build.gradle b/build.gradle index 8e70170..2b32213 100644 --- a/build.gradle +++ b/build.gradle @@ -84,10 +84,6 @@ dependencies { // XSS 방어를 위한 HTML Sanitizer 라이브러리 implementation 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20220608.1' - - // Redis 의존성 추가 - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - implementation 'io.lettuce:lettuce-core' } // Query DSL 설정 diff --git a/src/main/java/com/issueDive/config/RedisConfig.java b/src/main/java/com/issueDive/config/RedisConfig.java deleted file mode 100644 index b3b442a..0000000 --- a/src/main/java/com/issueDive/config/RedisConfig.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.issueDive.config; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -/** - * 9월 10일 최종 - Redis 설정 클래스 - * JWT 토큰 블랙리스트 관리를 위한 Redis 설정 - */ -@Configuration -public class RedisConfig { - @Value("${spring.redis.host:localhost}") - private String redisHost; - - @Value("${spring.redis.port:6379}") - private int redisPort; - - /** - * 9월 10일 최종 - Redis Connection Factory 설정 - */ - @Bean - public RedisConnectionFactory redisConnectionFactory() { - return new LettuceConnectionFactory(redisHost, redisPort); - } - - /** - * 9월 10일 최종 - RedisTemplate 설정 - * 일반적인 Redis 작업을 위한 템플릿 - */ - @Bean - public RedisTemplate redisTemplate() { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(redisConnectionFactory()); - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(new StringRedisSerializer()); - template.setHashKeySerializer(new StringRedisSerializer()); - template.setHashValueSerializer(new StringRedisSerializer()); - return template; - } - - /** - * 9월 10일 최종 - StringRedisTemplate 설정 - * 문자열 전용 Redis 작업을 위한 템플릿 - */ - @Bean - public StringRedisTemplate stringRedisTemplate() { - StringRedisTemplate template = new StringRedisTemplate(); - template.setConnectionFactory(redisConnectionFactory()); - return template; - } -} diff --git a/src/main/java/com/issueDive/controller/AuthController.java b/src/main/java/com/issueDive/controller/AuthController.java index d79d9eb..d7b982a 100644 --- a/src/main/java/com/issueDive/controller/AuthController.java +++ b/src/main/java/com/issueDive/controller/AuthController.java @@ -1,9 +1,5 @@ package com.issueDive.controller; -import com.issueDive.entity.RefreshToken; -import com.issueDive.repository.RefreshTokenRepository; -import com.issueDive.dto.RefreshTokenRequest; -import com.issueDive.service.TokenBlacklistService; import com.issueDive.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -17,14 +13,10 @@ import com.issueDive.service.UserService; import jakarta.validation.Valid; import lombok.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.time.LocalDateTime; -import java.util.Date; import java.util.List; import java.util.Map; @@ -34,19 +26,11 @@ @RestController @RequestMapping("/auth") @RequiredArgsConstructor -@Slf4j public class AuthController { private final UserService userService; private final JwtUtil jwtUtil; - @Autowired(required = false) - private final TokenBlacklistService tokenBlacklistService; - - @Autowired(required = false) // 9월 10일 최종 - private RefreshTokenRepository refreshTokenRepository; - - @Operation(summary = "회원가입 및 자동 로그인", description = "새로운 사용자를 등록하고, 성공 시 즉시 로그인 처리하여 JWT를 발급합니다.") @ApiResponses({ @ApiResponse(responseCode = "201", description = "회원가입 및 자동 로그인 성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = JwtResponse.class))), @@ -99,37 +83,13 @@ public ResponseEntity> login(@RequestBody(descrip // JWT AccessToken만 생성 (RefreshToken 제거) String accessToken = jwtUtil.generateAccessToken(userResponse.getId(), userResponse.getEmail()); - //Refresh Token 생성 (Repository가 있을 때만) - String refreshToken = null; - if (refreshTokenRepository != null) { - try { - // 기존 토큰 삭제 - refreshTokenRepository.deleteByUserEmail(userResponse.getEmail()); - - // 새 Refresh Token 생성 - refreshToken = jwtUtil.generateRefreshToken(userResponse.getId(), userResponse.getEmail()); - - // DB에 저장 - RefreshToken token = RefreshToken.builder() - .token(refreshToken) - .userId(userResponse.getId()) - .userEmail(userResponse.getEmail()) - .expiresAt(LocalDateTime.now().plusDays(7)) - .build(); - refreshTokenRepository.save(token); - } catch (Exception e) { - log.debug("9월 10일 최종 - Refresh Token 생성 실패 (무시): {}", e.getMessage()); - } - } - - // 응답 생성 - JwtResponse jwtResponse = JwtResponse.builder() - .accessToken(accessToken) - .refreshToken(refreshToken) // 9월 10일 최종 - .tokenType("Bearer") - .expiresIn(14400L) - .user(userResponse) - .build(); + // JWT 응답 생성 (RefreshToken 제거) + JwtResponse jwtResponse = JwtResponse.of( + accessToken, + "Bearer", + 14400L, // 9월1일 변경 - 4시간 (초 단위) + userResponse + ); return ResponseEntity.ok(ApiCommonResponse.ok(jwtResponse)); } catch (Exception e) { //인증 실패시 예외 던지기 (GlobalExceptionHandler에서 처리) @@ -143,30 +103,9 @@ public ResponseEntity> login(@RequestBody(descrip @ApiResponse(responseCode = "200", description = "로그아웃 성공") }) @PostMapping("/logout") - public ResponseEntity>> logout(@RequestHeader(value = "Authorization", required = false) String authHeader) { - - // 9월 10일 최종 - 블랙리스트 처리 - if (tokenBlacklistService != null && authHeader != null && authHeader.startsWith("Bearer ")) { - try { - String token = authHeader.substring(7); + public ResponseEntity>> logout() { + //JWT는 stateless하므로 서버에서 특별한 로그아웃 처리 불필요 - // Access Token 블랙리스트 추가 - Date expirationDate = jwtUtil.getExpirationDateFromToken(token); - tokenBlacklistService.addToBlacklist(token, expirationDate); - - // Refresh Token 삭제 - if (refreshTokenRepository != null) { - try { - String email = jwtUtil.getUserEmailFromToken(token); - refreshTokenRepository.deleteByUserEmail(email); - } catch (Exception e) { - log.debug("9월 10일 최종 - Refresh Token 삭제 실패 (무시)"); - } - } - } catch (Exception e) { - log.error("9월 10일 최종 - 로그아웃 처리 중 오류 (무시): {}", e.getMessage()); - } - } Map responseData = Map.of( "message", "로그아웃되었습니다. 클라이언트에서 토큰을 삭제해주세요.", "instruction", "localStorage에서 accessToken을 제거하세요." @@ -176,62 +115,6 @@ public ResponseEntity>> logout(@RequestHea return ResponseEntity.ok(response); } - // 4. 9월 10일 최종 - refresh 엔드포인트 추가 (최소 기능) - @Operation(summary = "토큰 갱신", description = "Refresh Token으로 새 Access Token을 발급받습니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "토큰 갱신 성공"), - @ApiResponse(responseCode = "401", description = "유효하지 않은 Refresh Token") - }) - @PostMapping("/refresh") - public ResponseEntity> refreshToken( - @RequestBody RefreshTokenRequest request) { - - if (refreshTokenRepository == null) { - throw new com.issueDive.exception.AuthenticationFailedException("토큰 갱신 기능이 비활성화되어 있습니다."); - } - - try { - String refreshToken = request.getRefreshToken(); - if (refreshToken == null || refreshToken.isEmpty()) { - throw new com.issueDive.exception.AuthenticationFailedException("Refresh Token이 필요합니다."); - } - - // DB에서 토큰 조회 - RefreshToken storedToken = refreshTokenRepository.findByToken(refreshToken) - .orElseThrow(() -> new com.issueDive.exception.AuthenticationFailedException("유효하지 않은 Refresh Token")); - - // 만료 확인 - if (storedToken.getExpiresAt().isBefore(LocalDateTime.now())) { - // 만료된 토큰은 삭제 - refreshTokenRepository.delete(storedToken); - throw new com.issueDive.exception.AuthenticationFailedException("만료된 Refresh Token"); - } - - // 사용자 정보 조회 - UserResponseDTO user = userService.findUserById(storedToken.getUserId()); - - // 새 Access Token 생성 - String newAccessToken = jwtUtil.generateAccessToken(user.getId(), user.getEmail()); - - // 응답 생성 - JwtResponse jwtResponse = JwtResponse.builder() - .accessToken(newAccessToken) - .refreshToken(refreshToken) // 기존 Refresh Token 유지 - .tokenType("Bearer") - .expiresIn(14400L) - .user(user) - .build(); - - return ResponseEntity.ok(ApiCommonResponse.ok(jwtResponse)); - - } catch (com.issueDive.exception.AuthenticationFailedException e) { - throw e; - } catch (Exception e) { - log.error("9월 10일 최종 - 토큰 갱신 중 오류: ", e); - throw new com.issueDive.exception.AuthenticationFailedException("토큰 갱신 실패"); - } - } - @Operation(summary = "사용자 정보 조회", description = "ID로 특정 사용자의 정보를 조회합니다.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "조회 성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = UserResponseDTO.class))), diff --git a/src/main/java/com/issueDive/dto/JwtResponse.java b/src/main/java/com/issueDive/dto/JwtResponse.java index d7c0ca6..dcd12dd 100644 --- a/src/main/java/com/issueDive/dto/JwtResponse.java +++ b/src/main/java/com/issueDive/dto/JwtResponse.java @@ -7,7 +7,6 @@ @Builder public class JwtResponse { private String accessToken; - private String refreshToken; private String tokenType; private Long expiresIn; private UserResponseDTO user; @@ -15,7 +14,6 @@ public class JwtResponse { public static JwtResponse of (String accessToken, String tokenType, Long expiresIn, UserResponseDTO user){ return JwtResponse.builder() .accessToken(accessToken) - .refreshToken(null) .tokenType(tokenType) .expiresIn(expiresIn) .user(user) diff --git a/src/main/java/com/issueDive/dto/RefreshTokenRequest.java b/src/main/java/com/issueDive/dto/RefreshTokenRequest.java deleted file mode 100644 index cc41a3e..0000000 --- a/src/main/java/com/issueDive/dto/RefreshTokenRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.issueDive.dto; -import lombok.*; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -@ToString -public class RefreshTokenRequest { - private String refreshToken; -} diff --git a/src/main/java/com/issueDive/entity/RefreshToken.java b/src/main/java/com/issueDive/entity/RefreshToken.java deleted file mode 100644 index aaa7b0a..0000000 --- a/src/main/java/com/issueDive/entity/RefreshToken.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.issueDive.entity; - -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -/** - * 9월 10일 최종 - Refresh Token 엔티티 - * 사용자별 리프레시 토큰을 데이터베이스에 저장하여 관리 - */ -@Entity -@Table(name = "refresh_token") -@Getter -@Setter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Builder -public class RefreshToken { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false, unique = true, length = 500) - private String token; - - @Column(name = "user_id", nullable = false) - private Long userId; - - @Column(name = "user_email", nullable = false) - private String userEmail; - - @Column(name = "expires_at", nullable = false) - private LocalDateTime expiresAt; - - @Column(name = "created_at", nullable = false, updatable = false) - private LocalDateTime createdAt; - - @PrePersist - protected void onCreate() { - this.createdAt = LocalDateTime.now(); - } -} diff --git a/src/main/java/com/issueDive/repository/RefreshTokenRepository.java b/src/main/java/com/issueDive/repository/RefreshTokenRepository.java deleted file mode 100644 index 9c7c412..0000000 --- a/src/main/java/com/issueDive/repository/RefreshTokenRepository.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.issueDive.repository; - -import com.issueDive.entity.RefreshToken; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -/** - * 9월 10일 최종 - Refresh Token Repository (최소 기능) - */ -@Repository -public interface RefreshTokenRepository extends JpaRepository{ - /** - * 9월 10일 최종 - 토큰으로 조회 - */ - Optional findByToken(String token); - - /** - * 9월 10일 최종 - 사용자 이메일로 삭제 (logout용) - */ - @Modifying - @Query("DELETE FROM RefreshToken r WHERE r.userEmail = :userEmail") - void deleteByUserEmail(@Param("userEmail") String userEmail); - - -} diff --git a/src/main/java/com/issueDive/security/JwtAuthenticationFilter.java b/src/main/java/com/issueDive/security/JwtAuthenticationFilter.java index 54ec674..06e6de3 100644 --- a/src/main/java/com/issueDive/security/JwtAuthenticationFilter.java +++ b/src/main/java/com/issueDive/security/JwtAuthenticationFilter.java @@ -1,6 +1,5 @@ package com.issueDive.security; -import com.issueDive.service.TokenBlacklistService; import com.issueDive.util.JwtUtil; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -8,7 +7,6 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; @@ -26,8 +24,6 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter{ private final JwtUtil jwtUtil; private final CustomUserDetailsService userDetailsService; - @Autowired(required = false) // 9월 10일 최종 - private TokenBlacklistService tokenBlacklistService; // 9월 10일 최종 @Override protected void doFilterInternal(HttpServletRequest request, @@ -39,12 +35,6 @@ protected void doFilterInternal(HttpServletRequest request, if (jwt != null && SecurityContextHolder.getContext().getAuthentication() == null) { - // 9월 10일 최종 - 블랙리스트 체크 추가 - if (tokenBlacklistService != null && tokenBlacklistService.isBlacklisted(jwt)) { - log.warn("9월 10일 최종 - 블랙리스트 토큰 사용 시도"); - setErrorResponse(response, "토큰이 무효화되었습니다."); - return; - } // JWT에서 이메일 추출 String email = jwtUtil.getUserEmailFromToken(jwt); diff --git a/src/main/java/com/issueDive/service/TokenBlacklistService.java b/src/main/java/com/issueDive/service/TokenBlacklistService.java deleted file mode 100644 index 3c0c365..0000000 --- a/src/main/java/com/issueDive/service/TokenBlacklistService.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.issueDive.service; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.time.Duration; -import java.util.Date; - -/** - * 9월 10일 최종 - Token Blacklist Service - * Redis를 사용하여 로그아웃된 JWT 토큰을 블랙리스트로 관리 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class TokenBlacklistService { - private final StringRedisTemplate stringRedisTemplate; - private static final String BLACKLIST_PREFIX = "blacklist:token:"; - - /** - * 9월 10일 최종 - 토큰을 블랙리스트에 추가 - */ - public void addToBlacklist(String token, Date expirationDate) { - try { - String key = BLACKLIST_PREFIX + token; - long expirationMillis = expirationDate.getTime() - System.currentTimeMillis(); - - if (expirationMillis > 0) { - stringRedisTemplate.opsForValue().set( - key, - "blacklisted", - Duration.ofMillis(expirationMillis) - ); - log.info("9월 10일 최종 - 토큰 블랙리스트 추가됨"); - } - } catch (Exception e) { - log.error("9월 10일 최종 - 토큰 블랙리스트 추가 실패: {}", e.getMessage()); - } - } - - /** - * 9월 10일 최종 - 토큰이 블랙리스트에 있는지 확인 - */ - public boolean isBlacklisted(String token) { - try { - String key = BLACKLIST_PREFIX + token; - Boolean exists = stringRedisTemplate.hasKey(key); - return Boolean.TRUE.equals(exists); - } catch (Exception e) { - log.error("9월 10일 최종 - 토큰 블랙리스트 확인 실패: {}", e.getMessage()); - return true; // Redis 장애 시 보안을 위해 true 반환 - } - } -} diff --git a/src/main/java/com/issueDive/util/JwtUtil.java b/src/main/java/com/issueDive/util/JwtUtil.java index 8f19d5c..498d70a 100644 --- a/src/main/java/com/issueDive/util/JwtUtil.java +++ b/src/main/java/com/issueDive/util/JwtUtil.java @@ -25,10 +25,6 @@ public class JwtUtil { @Value("${jwt.expiration:14400}") private Long jwtExpiration; - // 9월 10일 최종 - Refresh Token 만료 시간 (7일) - @Value("${jwt.refresh.expiration:604800}") - private Long refreshTokenExpiration; - /** * JWT 액세스 토큰 생성 * @param userId 사용자 ID @@ -44,20 +40,6 @@ public String generateAccessToken(Long userId, String email){ return createToken(claims, email, jwtExpiration); } - /** - * 9월 10일 최종 - Refresh Token 생성 - * @param userId 사용자 ID - * @param email 사용자 이메일 - * @return JWT Refresh Token - */ - public String generateRefreshToken(Long userId, String email) { - Map claims = new HashMap<>(); - claims.put("userId", userId); - claims.put("email", email); - claims.put("type", "REFRESH"); - - return createToken(claims, email, refreshTokenExpiration); - } /** * 토큰에서 사용자 ID 추출 * @param token JWT 토큰 diff --git a/src/test/java/com/issueDive/controller/AuthControllerTest.java b/src/test/java/com/issueDive/controller/AuthControllerTest.java index 8c03996..f7fb8af 100644 --- a/src/test/java/com/issueDive/controller/AuthControllerTest.java +++ b/src/test/java/com/issueDive/controller/AuthControllerTest.java @@ -1,13 +1,10 @@ package com.issueDive.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import com.issueDive.dto.RefreshTokenRequest; import com.issueDive.dto.UserResponseDTO; import com.issueDive.exception.AuthenticationFailedException; import com.issueDive.exception.UserNotFoundException; -import com.issueDive.repository.RefreshTokenRepository; import com.issueDive.security.CustomUserDetailsService; -import com.issueDive.service.TokenBlacklistService; import com.issueDive.service.UserService; import com.issueDive.util.JwtUtil; import org.junit.jupiter.api.DisplayName; @@ -30,12 +27,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -import com.issueDive.entity.RefreshToken; -import org.springframework.test.util.ReflectionTestUtils; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.Optional; - import static org.mockito.MockitoAnnotations.openMocks; /** * @WebMvcTest: 웹 계층(컨트롤러)에 대한 슬라이스 테스트를 진행합니다. @@ -67,14 +58,6 @@ public class AuthControllerTest { @MockitoBean private CustomUserDetailsService customUserDetailsService; - - @MockitoBean - private TokenBlacklistService tokenBlacklistService; - - @MockitoBean - private RefreshTokenRepository refreshTokenRepository; - - @Test @DisplayName("[SUCCESS] POST /auth/signup - 회원가입 성공") void signUp_success() throws Exception { @@ -103,7 +86,7 @@ void signUp_success() throws Exception { } @Test - @DisplayName("[SUCCESS] POST /auth/login - 로그인 성공(Refresh Token 포함)") + @DisplayName("[SUCCESS] POST /auth/login - 로그인 성공") void login_success() throws Exception { // given: 로그인 요청 데이터 설정 var requestBody = Map.of( @@ -112,12 +95,10 @@ void login_success() throws Exception { ); var userResponse = new UserResponseDTO(1L, "alice", "alice@test.com"); var mockToken = "mock-access-token"; - var mockRefreshToken = "mock-refresh-token"; // 컨트롤러의 로그인 로직에 필요한 Mocking 설정 given(userService.findUserByEmail(anyString())).willReturn(userResponse); given(jwtUtil.generateAccessToken(anyLong(), anyString())).willReturn(mockToken); - given(jwtUtil.generateRefreshToken(anyLong(), anyString())).willReturn(mockRefreshToken); // when & then mvc.perform(post("/auth/login") @@ -126,11 +107,8 @@ void login_success() throws Exception { .andExpect(status().isOk()) // 200 OK 상태 코드 확인 .andExpect(jsonPath("$.success").value(true)) .andExpect(jsonPath("$.data.accessToken").value(mockToken)) - .andExpect(jsonPath("$.data.refreshToken").value(mockRefreshToken)) .andExpect(jsonPath("$.data.tokenType").value("Bearer")) .andExpect(jsonPath("$.data.user.email").value("alice@test.com")); - - verify(refreshTokenRepository, times(1)).save(any(RefreshToken.class)); } @Test @@ -244,5 +222,4 @@ void logout_success() throws Exception { .andExpect(jsonPath("$.data.instruction").value("localStorage에서 accessToken을 제거하세요.")); } - } diff --git a/src/test/java/com/issueDive/exception/GlobalExceptionHandlerTest.java b/src/test/java/com/issueDive/exception/GlobalExceptionHandlerTest.java index 2734202..932e62e 100644 --- a/src/test/java/com/issueDive/exception/GlobalExceptionHandlerTest.java +++ b/src/test/java/com/issueDive/exception/GlobalExceptionHandlerTest.java @@ -2,7 +2,6 @@ import com.issueDive.controller.AuthController; import com.issueDive.security.CustomUserDetailsService; -import com.issueDive.service.TokenBlacklistService; import com.issueDive.util.JwtUtil; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -39,9 +38,6 @@ public class GlobalExceptionHandlerTest { @MockitoBean private CustomUserDetailsService customUserDetailsService; - @MockitoBean - private TokenBlacklistService tokenBlacklistService; - // DuplicateEmail -> 409 @Test public void signUp_duplicateEmail_conflict() throws Exception { diff --git a/src/test/java/com/issueDive/service/TokenBlacklistServiceTest.java b/src/test/java/com/issueDive/service/TokenBlacklistServiceTest.java deleted file mode 100644 index 21eb3d6..0000000 --- a/src/test/java/com/issueDive/service/TokenBlacklistServiceTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.issueDive.service; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.ValueOperations; - -import java.time.Duration; -import java.util.Date; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.*; - -/** - * 9월 10일 최종 - TokenBlacklistService 테스트 - */ -@ExtendWith(MockitoExtension.class) -public class TokenBlacklistServiceTest { - @Mock - private StringRedisTemplate stringRedisTemplate; - - @Mock - private ValueOperations valueOperations; - - @InjectMocks - private TokenBlacklistService tokenBlacklistService; - - - @Test - @DisplayName("9월 10일 최종 - 토큰 블랙리스트 추가") - void addToBlacklist_Success() { - // given - String token = "test.token"; - Date expirationDate = new Date(System.currentTimeMillis() + 3600000); - given(stringRedisTemplate.opsForValue()).willReturn(valueOperations); - - // when - tokenBlacklistService.addToBlacklist(token, expirationDate); - - // then - verify(valueOperations).set(anyString(), eq("blacklisted"), any(Duration.class)); - } - - @Test - @DisplayName("9월 10일 최종 - 블랙리스트 확인") - void isBlacklisted_Success() { - // given - String token = "test.token"; - given(stringRedisTemplate.hasKey(anyString())).willReturn(true); - - // when - boolean result = tokenBlacklistService.isBlacklisted(token); - - // then - assertThat(result).isTrue(); - } -}