From df52e3211cbe8977fa5ce29419e88954ac3d4611 Mon Sep 17 00:00:00 2001 From: haennni Date: Tue, 10 Jun 2025 00:32:42 +0900 Subject: [PATCH 1/5] =?UTF-8?q?test:=20=EC=BF=A0=ED=82=A4=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=94=EC=9D=B8=EB=94=A9=20=EB=B0=8F=20=EC=BF=A0?= =?UTF-8?q?=ED=82=A4=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20=ED=85=8C?= =?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 - CookiePropertiesTest: @ConfigurationProperties 바인딩 테스트를 설계하였습니다. - CookieServiceTest: 쿠키 저장 시 HttpServletResponse에 Set-Cookie 헤더가 정상적으로 추가되는지 검증 테스트를 설계하였습니다. --- .../auth/cookie/CookiePropertiesTest.java | 37 ++++++++ .../global/auth/cookie/CookieServiceTest.java | 90 +++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 src/test/java/com/project/growfit/global/auth/cookie/CookiePropertiesTest.java create mode 100644 src/test/java/com/project/growfit/global/auth/cookie/CookieServiceTest.java diff --git a/src/test/java/com/project/growfit/global/auth/cookie/CookiePropertiesTest.java b/src/test/java/com/project/growfit/global/auth/cookie/CookiePropertiesTest.java new file mode 100644 index 0000000..fed5121 --- /dev/null +++ b/src/test/java/com/project/growfit/global/auth/cookie/CookiePropertiesTest.java @@ -0,0 +1,37 @@ +package com.project.growfit.global.auth.cookie; + + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; + +import static org.assertj.core.api.Assertions.assertThat; +/** + * CookieProperties 클래스의 @ConfigurationProperties 바인딩 테스트 + */ +@SpringBootTest +@EnableConfigurationProperties(value = CookieProperties.class) +@TestPropertySource(properties = { + "jwt.secret_key=test_secret_key", + "custom.cookie.secure=true", + "custom.cookie.http-only=false", + "custom.cookie.same-site=None", + "custom.cookie.max-age=1800" +}) +class CookiePropertiesTest { + + @Autowired + private CookieProperties cookieProperties; + + @Test + @DisplayName("application.yml 값이 정상적으로 바인딩되어야 한다") + void testCookiePropertiesBinding() { + assertThat(cookieProperties.isSecure()).isTrue(); + assertThat(cookieProperties.isHttpOnly()).isFalse(); + assertThat(cookieProperties.getSameSite()).isEqualTo("None"); + assertThat(cookieProperties.getMaxAge()).isEqualTo(1800); + } +} \ No newline at end of file diff --git a/src/test/java/com/project/growfit/global/auth/cookie/CookieServiceTest.java b/src/test/java/com/project/growfit/global/auth/cookie/CookieServiceTest.java new file mode 100644 index 0000000..c39b998 --- /dev/null +++ b/src/test/java/com/project/growfit/global/auth/cookie/CookieServiceTest.java @@ -0,0 +1,90 @@ +package com.project.growfit.global.auth.cookie; + +import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.http.HttpHeaders; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + +/** + * CookieService 단위 테스트 클래스. + * - 목적: 쿠키 저장 로직이 정상적으로 동작하는지 검증 + * - HttpServletResponse를 mocking 하여 addHeader 동작 여부 확인 + */ +class CookieServiceTest { + private CookieProperties cookieProperties; + private CookieService cookieService; + private HttpServletResponse response; + + /** + * 테스트 전 공통 초기화. + * - CookieProperties 값을 직접 세팅하여 의존성 주입 시뮬레이션 + */ + @BeforeEach + void setUp() { + cookieProperties = new CookieProperties(); + setField(cookieProperties, "secure", true); + setField(cookieProperties, "httpOnly", true); + setField(cookieProperties, "sameSite", "Lax"); + setField(cookieProperties, "maxAge", 1800); + + cookieService = new CookieService(cookieProperties); + response = mock(HttpServletResponse.class); + } + + @Test + @DisplayName("AccessToken 쿠키 저장이 되어야한다.") + void saveAccessTokenToCookie_shouldAddHeader() { + String token = "test-token"; + + cookieService.saveAccessTokenToCookie(response, token); + + ArgumentCaptor nameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor valueCaptor = ArgumentCaptor.forClass(String.class); + + verify(response).addHeader(nameCaptor.capture(), valueCaptor.capture()); + + assertThat(nameCaptor.getValue()).isEqualTo(HttpHeaders.SET_COOKIE); + assertThat(valueCaptor.getValue()).contains("accessToken=test-token"); + assertThat(valueCaptor.getValue()).contains("HttpOnly"); + assertThat(valueCaptor.getValue()).contains("Secure"); + assertThat(valueCaptor.getValue()).contains("SameSite=Lax"); + } + + @Test + @DisplayName("Email 쿠키 저장이 되어야한다.") + void saveEmailToCookie_shouldAddHeader() { + String email = "test@example.com"; + + cookieService.saveEmailToCookie(response, email); + + ArgumentCaptor nameCaptor = ArgumentCaptor.forClass(String.class); + ArgumentCaptor valueCaptor = ArgumentCaptor.forClass(String.class); + + verify(response).addHeader(nameCaptor.capture(), valueCaptor.capture()); + + assertThat(nameCaptor.getValue()).isEqualTo(HttpHeaders.SET_COOKIE); + assertThat(valueCaptor.getValue()).contains("email=test@example.com"); + } + + /** + * private 필드 주입을 위한 reflection 유틸 메서드. + * @param target 대상 객체 + * @param fieldName 필드명 + * @param value 주입할 값 + */ + private void setField(Object target, String fieldName, Object value) { + try { + var field = target.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(target, value); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file From c372772a9ca16f5d884aee25c6102557acd70a0d Mon Sep 17 00:00:00 2001 From: haennni Date: Tue, 10 Jun 2025 00:36:22 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat(auth):=20=EC=BF=A0=ED=82=A4=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EB=B0=94=EC=9D=B8=EB=94=A9=20=EB=B0=8F=20?= =?UTF-8?q?=EA=B3=B5=ED=86=B5=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - application 설정 값을 기반으로 쿠키 속성을 바인딩했습니다 - accessToken, email 등을 응답에 쿠키로 저장하는 유틸을 구현했습니다 --- .../global/auth/cookie/CookieProperties.java | 17 +++++++++ .../global/auth/cookie/CookieService.java | 38 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/main/java/com/project/growfit/global/auth/cookie/CookieProperties.java create mode 100644 src/main/java/com/project/growfit/global/auth/cookie/CookieService.java diff --git a/src/main/java/com/project/growfit/global/auth/cookie/CookieProperties.java b/src/main/java/com/project/growfit/global/auth/cookie/CookieProperties.java new file mode 100644 index 0000000..f970cd5 --- /dev/null +++ b/src/main/java/com/project/growfit/global/auth/cookie/CookieProperties.java @@ -0,0 +1,17 @@ +package com.project.growfit.global.auth.cookie; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "custom.cookie") +@Getter +@Setter +public class CookieProperties { + private boolean secure; + private boolean httpOnly; + private String sameSite; + private int maxAge; +} \ No newline at end of file diff --git a/src/main/java/com/project/growfit/global/auth/cookie/CookieService.java b/src/main/java/com/project/growfit/global/auth/cookie/CookieService.java new file mode 100644 index 0000000..5d4f73e --- /dev/null +++ b/src/main/java/com/project/growfit/global/auth/cookie/CookieService.java @@ -0,0 +1,38 @@ +package com.project.growfit.global.auth.cookie; + +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseCookie; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class CookieService { + + private final CookieProperties cookieProperties; + + public void saveAccessTokenToCookie(HttpServletResponse response, String token) { + ResponseCookie cookie = createCookie("accessToken", token); + response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); + log.info("[saveAccessTokenToCookie] Access Token이 쿠키에 저장되었습니다."); + } + + public void saveEmailToCookie(HttpServletResponse response, String email) { + ResponseCookie cookie = createCookie("email", email); + response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); + log.info("[saveEmailToCookie] 이메일이 쿠키에 저장되었습니다."); + } + + private ResponseCookie createCookie(String name, String value) { + return ResponseCookie.from(name, value) + .httpOnly(cookieProperties.isHttpOnly()) + .secure(cookieProperties.isSecure()) + .sameSite(cookieProperties.getSameSite()) + .maxAge(cookieProperties.getMaxAge()) + .path("/") + .build(); + } +} From 15e857e0b7537c2524c00bebe6c8771970cc624e Mon Sep 17 00:00:00 2001 From: haennni Date: Tue, 10 Jun 2025 00:37:44 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor(jwt):=20JwtProvider=20=EB=82=B4=20?= =?UTF-8?q?=EC=BF=A0=ED=82=A4=20=EC=A0=80=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - accessToken 재발급 시 직접 헤더 설정 대신 공통 쿠키 저장 유틸을 사용했습니다. - 중복 로직을 제거하고 책임을 분리했습니다. --- .../growfit/global/auth/jwt/JwtProvider.java | 53 ++++--------------- 1 file changed, 11 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/project/growfit/global/auth/jwt/JwtProvider.java b/src/main/java/com/project/growfit/global/auth/jwt/JwtProvider.java index 5070cc5..c8014ac 100644 --- a/src/main/java/com/project/growfit/global/auth/jwt/JwtProvider.java +++ b/src/main/java/com/project/growfit/global/auth/jwt/JwtProvider.java @@ -2,6 +2,7 @@ import com.project.growfit.domain.User.repository.ChildRepository; import com.project.growfit.domain.User.repository.ParentRepository; +import com.project.growfit.global.auth.cookie.CookieService; import com.project.growfit.global.auth.dto.CustomUserDetails; import com.project.growfit.global.redis.entity.TokenRedis; import com.project.growfit.global.redis.repository.TokenRedisRepository; @@ -31,9 +32,6 @@ @Slf4j @Component public class JwtProvider { - - @Value("${app.cookie.secure}") - private boolean isProdSecure; private static final String AUTHORITIES_KEY = "role"; private SecretKey secretKey; @@ -42,34 +40,31 @@ public class JwtProvider { private final TokenRedisRepository tokenRedisRepository; private final ParentRepository parentRepository; private final ChildRepository childRepository; + private final CookieService cookieService; public JwtProvider(@Value("${jwt.secret_key}") String key, @Value("${jwt.access-token-validity-in-seconds}") long accessTokenValiditySeconds, - @Value("${jwt.refresh-token-validity-in-seconds}") long refreshTokenValiditySeconds, TokenRedisRepository tokenRedisRepository, ParentRepository parentRepository, ChildRepository childRepository) { + @Value("${jwt.refresh-token-validity-in-seconds}") long refreshTokenValiditySeconds, TokenRedisRepository tokenRedisRepository, ParentRepository parentRepository, ChildRepository childRepository, CookieService cookieService) { this.secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), Jwts.SIG.HS256.key().build().getAlgorithm()); this.accessTokenValidityMilliSeconds = accessTokenValiditySeconds * 1000; this.refreshTokenValidityMilliSeconds = refreshTokenValiditySeconds * 1000; this.tokenRedisRepository = tokenRedisRepository; this.parentRepository = parentRepository; this.childRepository = childRepository; - log.info("[JwtProvider] JwtProvider 초기화 완료. AccessToken 유효시간: {}ms, RefreshToken 유효시간: {}ms", + this.cookieService = cookieService; + log.debug("[JwtProvider] JwtProvider 초기화 완료. AccessToken 유효시간: {}ms, RefreshToken 유효시간: {}ms", accessTokenValidityMilliSeconds, refreshTokenValidityMilliSeconds); } - @PostConstruct - public void init() { - log.info("[JwtProvider] isProdSecure: {}", isProdSecure); // ← 여기를 확인 - } - public String createAccessToken(String userId, String role, String loginType) { String token = createJwt(userId, role, loginType, accessTokenValidityMilliSeconds); - log.info("[createAccessToken] Access Token 생성 완료 for userId={} with role={}", userId, role); + log.debug("[createAccessToken] Access Token 생성 완료 for userId={} with role={}", userId, role); return token; } public String createRefreshToken(String userId) { String token = createJwt(userId, "REFRESH", "", refreshTokenValidityMilliSeconds); - log.info("[createRefreshToken] Refresh Token 생성 완료 for userId={}", userId); + log.debug("[createRefreshToken] Refresh Token 생성 완료 for userId={}", userId); return token; } @@ -138,7 +133,7 @@ public UsernamePasswordAuthenticationToken createAuthenticationFromToken(String .orElseThrow(() -> new UsernameNotFoundException("자식을 찾을 수 없습니다: " + userId)); } CustomUserDetails userDetails = new CustomUserDetails(user); - log.info("[createAuthenticationFromToken] Authentication 생성: userId={}, 역할={}", userId, role); + log.debug("[createAuthenticationFromToken] Authentication 생성: userId={}, 역할={}", userId, role); return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); } @@ -147,22 +142,18 @@ public UsernamePasswordAuthenticationToken replaceAccessToken(HttpServletRespons TokenRedis tokenRedis = tokenRedisRepository.findByAccessToken(token) .orElseThrow(() -> new RuntimeException("다시 로그인 해 주세요.")); String refreshToken = tokenRedis.getRefreshToken(); - Jwts.parser().setSigningKey(secretKey).build().parseClaimsJws(refreshToken); + log.debug("[replaceAccessToken] 토큰 재발급 시작"); - log.info("[replaceAccessToken] 토큰 재발급 시작"); String userId = tokenRedis.getId(); - Result result = getResult(userId); - - String newAccessToken = createAccessToken(userId, result.role(), result.login_type()); tokenRedis.updateAccessToken(newAccessToken); tokenRedisRepository.save(tokenRedis); - log.info("[replaceAccessToken] 토큰 재발급 완료 - 새로운 액세스 토큰 발급됨: {}", newAccessToken); + log.debug("[replaceAccessToken] 토큰 재발급 완료 - 새로운 액세스 토큰 발급됨: {}", newAccessToken); - saveAccessTokenToCookie(response, newAccessToken); + cookieService.saveAccessTokenToCookie(response, newAccessToken); return new UsernamePasswordAuthenticationToken(new CustomUserDetails(userId, result.role()), null, List.of(new SimpleGrantedAuthority(result.role()))); @@ -194,28 +185,6 @@ private Result getResult(String userId) { private record Result(String role, String login_type) { } - public void saveAccessTokenToCookie(HttpServletResponse response, String token) { - Cookie cookie = new Cookie("accessToken", token); - cookie.setPath("/"); - cookie.setHttpOnly(false); - cookie.setSecure(isProdSecure); - cookie.setMaxAge((int) (accessTokenValidityMilliSeconds / 1000)); - response.addCookie(cookie); - log.info("[saveAccessTokenToCookie] Access Token이 쿠키에 저장되었습니다."); - } - - public void saveEmailToCookie(HttpServletResponse response, String email) { - ResponseCookie cookie = ResponseCookie.from("email", email) - .httpOnly(false) - .secure(isProdSecure) - .maxAge(60) - .path("/") - .build(); - response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString()); - log.info("[saveEmailToCookie] 이메일이 쿠키에 저장되었습니다."); - } - - public String getSubjectFromToken(String token) { try { Claims claims = Jwts.parser() From 4cdfb9978afd3715fe51a049c852e68b679ba5b9 Mon Sep 17 00:00:00 2001 From: haennni Date: Tue, 10 Jun 2025 00:40:49 +0900 Subject: [PATCH 4/5] =?UTF-8?q?chore:=20=EC=9D=B8=EC=A6=9D=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=EC=97=90=20=EC=BF=A0=ED=82=A4=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로그인 필터 및 시큐리티 설정에 쿠키 유틸 주입하였습니다. - 인증 흐름 내 쿠키 기반 응답 처리 가능하도록 구성하였습니다. --- .../project/growfit/global/auth/filter/LoginFilter.java | 7 +++++-- .../com/project/growfit/global/config/SecurityConfig.java | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/project/growfit/global/auth/filter/LoginFilter.java b/src/main/java/com/project/growfit/global/auth/filter/LoginFilter.java index b1e35d9..7c4aa91 100644 --- a/src/main/java/com/project/growfit/global/auth/filter/LoginFilter.java +++ b/src/main/java/com/project/growfit/global/auth/filter/LoginFilter.java @@ -1,6 +1,7 @@ package com.project.growfit.global.auth.filter; import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.growfit.global.auth.cookie.CookieService; import com.project.growfit.global.auth.dto.CustomUserDetails; import com.project.growfit.global.auth.jwt.JwtProvider; import jakarta.servlet.FilterChain; @@ -20,11 +21,13 @@ public class LoginFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager; private final JwtProvider jwtProvider; + private final CookieService cookieService; private final ObjectMapper objectMapper = new ObjectMapper(); - public LoginFilter(AuthenticationManager authenticationManager, JwtProvider jwtProvider) { + public LoginFilter(AuthenticationManager authenticationManager, JwtProvider jwtProvider, CookieService cookieService) { this.authenticationManager = authenticationManager; this.jwtProvider = jwtProvider; + this.cookieService = cookieService; } @Override @@ -68,7 +71,7 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR String token = jwtProvider.createAccessToken(user_id, role, login_type); - jwtProvider.saveAccessTokenToCookie(response, token); + cookieService.saveAccessTokenToCookie(response, token); log.info("[successfulAuthentication] 로그인 성공 - 사용자 ID: {}, 역할: {}, JWT 저장 완료", user_id, role); diff --git a/src/main/java/com/project/growfit/global/config/SecurityConfig.java b/src/main/java/com/project/growfit/global/config/SecurityConfig.java index 6f2eef2..e8ddeaa 100644 --- a/src/main/java/com/project/growfit/global/config/SecurityConfig.java +++ b/src/main/java/com/project/growfit/global/config/SecurityConfig.java @@ -1,5 +1,6 @@ package com.project.growfit.global.config; +import com.project.growfit.global.auth.cookie.CookieService; import com.project.growfit.global.auth.jwt.JwtProvider; import com.project.growfit.global.auth.jwt.excpetion.CustomAccessDeniedHandler; import com.project.growfit.global.auth.jwt.excpetion.CustomAuthenticationEntryPoint; @@ -31,6 +32,7 @@ public class SecurityConfig { private final CustomAccessDeniedHandler customAccessDeniedHandler; private final AuthenticationConfiguration authenticationConfiguration; private final JwtProvider jwtUtil; + private final CookieService cookieService; @Bean public PasswordEncoder passwordEncoder() { @@ -77,7 +79,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .authenticationEntryPoint(customAuthenticationEntryPoint) .accessDeniedHandler(customAccessDeniedHandler) ) - .addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration), jwtUtil), UsernamePasswordAuthenticationFilter.class) + .addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration), jwtUtil, cookieService), UsernamePasswordAuthenticationFilter.class) .addFilterBefore(new JwtCookieAuthenticationFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class); return http.build(); From ff0015c4afe3200c211d5786910ea3c7bff47f45 Mon Sep 17 00:00:00 2001 From: haennni Date: Tue, 10 Jun 2025 00:43:38 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20=EC=BF=A0=ED=82=A4=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=20=EB=B0=A9=EC=8B=9D=20=EA=B3=B5=ED=86=B5=20=EC=9C=A0?= =?UTF-8?q?=ED=8B=B8=EB=A1=9C=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - JwtProvider를 직접 호출해 쿠키를 설정하던 로직을 제거했습니다. - CookieService를 통해 accessToken 저장 책임을 일관되게 위임했습니다. --- .../domain/User/controller/TestAuthController.java | 4 +++- .../domain/User/service/impl/AuthChildServiceImpl.java | 10 ++++++---- .../domain/User/service/impl/OauthServiceImpl.java | 6 ++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/project/growfit/domain/User/controller/TestAuthController.java b/src/main/java/com/project/growfit/domain/User/controller/TestAuthController.java index 9f8a499..5d4df8c 100644 --- a/src/main/java/com/project/growfit/domain/User/controller/TestAuthController.java +++ b/src/main/java/com/project/growfit/domain/User/controller/TestAuthController.java @@ -1,6 +1,7 @@ package com.project.growfit.domain.User.controller; import com.project.growfit.domain.User.dto.response.ParentLoginResponseDto; +import com.project.growfit.global.auth.cookie.CookieService; import com.project.growfit.global.auth.jwt.JwtProvider; import com.project.growfit.global.redis.entity.TokenRedis; import com.project.growfit.global.redis.repository.TokenRedisRepository; @@ -24,6 +25,7 @@ public class TestAuthController { private final JwtProvider jwtProvider; private final TokenRedisRepository tokenRedisRepository; + private final CookieService cookieService; @PostMapping("/generate-token") @Operation(summary = "테스트 계정 토큰 변환 api") @@ -32,7 +34,7 @@ public ResultResponse generateToken(@RequestBody Map request, String newAccessToken = jwtProvider.createAccessToken(email, "ROLE_PARENT", "SOCIAL_KAKAO"); String newRefreshToken = jwtProvider.createRefreshToken(email); tokenRedisRepository.save(new TokenRedis(email, newAccessToken, newRefreshToken)); - jwtProvider.saveAccessTokenToCookie(response, newAccessToken); + cookieService.saveAccessTokenToCookie(response, newAccessToken); log.info("로그인 성공: email={}, accessToken 저장 완료", email); ParentLoginResponseDto dto = new ParentLoginResponseDto(email, true); diff --git a/src/main/java/com/project/growfit/domain/User/service/impl/AuthChildServiceImpl.java b/src/main/java/com/project/growfit/domain/User/service/impl/AuthChildServiceImpl.java index 06b3353..91762ed 100644 --- a/src/main/java/com/project/growfit/domain/User/service/impl/AuthChildServiceImpl.java +++ b/src/main/java/com/project/growfit/domain/User/service/impl/AuthChildServiceImpl.java @@ -7,6 +7,7 @@ import com.project.growfit.domain.User.entity.Child; import com.project.growfit.domain.User.repository.ChildRepository; import com.project.growfit.domain.User.service.AuthChildService; +import com.project.growfit.global.auth.cookie.CookieService; import com.project.growfit.global.auth.jwt.JwtProvider; import com.project.growfit.global.auth.service.CustomAuthenticationProvider; import com.project.growfit.global.exception.BusinessException; @@ -32,6 +33,7 @@ public class AuthChildServiceImpl implements AuthChildService { private final ChildRepository childRepository; private final PasswordEncoder passwordEncoder; + private final CookieService cookieService; private final JwtProvider jwtProvider; private final TokenRedisRepository tokenRedisRepository; private final CustomAuthenticationProvider authenticationProvider; @@ -47,7 +49,7 @@ public ResultResponse findByCode(String code) { @Override public ResultResponse registerChildCredentials(Long child_id, AuthChildRequestDto request) { - log.info("[registerChildCredentials] 아이 계정 정보 등록 요청: child_id={}, child_login_id={}", child_id, request.childId()); + log.debug("[registerChildCredentials] 아이 계정 정보 등록 요청: child_id={}, child_login_id={}", child_id, request.childId()); boolean isExists = childRepository.existsByLoginIdOrPassword(request.childId(), request.childPassword()); if (isExists) { @@ -88,10 +90,10 @@ public ResultResponse login(AuthChildRequestDto request, HttpServletResponse String newRefreshToken = jwtProvider.createRefreshToken(child.getLoginId()); tokenRedisRepository.save(new TokenRedis(child.getLoginId(), newAccessToken, newRefreshToken)); - log.info("[login] 새 AccessToken 및 RefreshToken 저장 완료: child_login_id={}", request.childId()); + log.debug("[login] 새 AccessToken 및 RefreshToken 저장 완료: child_login_id={}", request.childId()); - jwtProvider.saveAccessTokenToCookie(response, newAccessToken); - log.info("[login] AccessToken을 쿠키에 저장 완료: child_login_id={}", request.childId()); + cookieService.saveAccessTokenToCookie(response, newAccessToken); + log.debug("[login] AccessToken을 쿠키에 저장 완료: child_login_id={}", request.childId()); return new ResultResponse<>(ResultCode.CHILD_LOGIN_SUCCESS, null); } diff --git a/src/main/java/com/project/growfit/domain/User/service/impl/OauthServiceImpl.java b/src/main/java/com/project/growfit/domain/User/service/impl/OauthServiceImpl.java index 22c590d..11d49ff 100644 --- a/src/main/java/com/project/growfit/domain/User/service/impl/OauthServiceImpl.java +++ b/src/main/java/com/project/growfit/domain/User/service/impl/OauthServiceImpl.java @@ -9,6 +9,7 @@ import com.project.growfit.domain.User.entity.Parent; import com.project.growfit.domain.User.repository.ParentRepository; import com.project.growfit.domain.User.service.OauthService; +import com.project.growfit.global.auth.cookie.CookieService; import com.project.growfit.global.auth.jwt.JwtProvider; import com.project.growfit.global.exception.BusinessException; import com.project.growfit.global.exception.ErrorCode; @@ -37,6 +38,7 @@ public class OauthServiceImpl implements OauthService { private final JwtProvider jwtProvider; private final ParentRepository parentRepository; + private final CookieService cookieService; private final RestTemplate restTemplate = new RestTemplate(); private final TokenRedisRepository tokenRedisRepository; @@ -125,7 +127,7 @@ public ResultResponse kakaoLogin(String accessToken, HttpServletResponse resp isNewUser = true; signUp(requestDto); parentResponse = findByUserKakaoIdentifier(requestDto.id()); - jwtProvider.saveEmailToCookie(response, email); + cookieService.saveEmailToCookie(response, email); if (parentResponse == null) { log.error("[kakaoLogin] 회원가입 후 사용자 정보 조회 실패: email={}", requestDto.email()); throw new BusinessException(ErrorCode.USER_REGISTRATION_FAILED); @@ -179,6 +181,6 @@ private void generateAndSaveTokens(HttpServletResponse response, ParentResponse String accessToken = jwtProvider.createAccessToken(parentResponse.email(), parentResponse.roles(), "SOCIAL_KAKAO"); String refreshToken = jwtProvider.createRefreshToken(parentResponse.email()); tokenRedisRepository.save(new TokenRedis(parentResponse.email(), accessToken, refreshToken)); - jwtProvider.saveAccessTokenToCookie(response, accessToken); + cookieService.saveAccessTokenToCookie(response, accessToken); } } \ No newline at end of file