From f7d2172cb050f4d22f9307b2405f28f5751201c8 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 6 Feb 2025 08:29:31 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20TokenProvider=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EA=B0=81=20=ED=86=A0=ED=81=B0=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EC=BA=A1=EC=8A=90?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/AuthService.java | 23 +-- .../auth/service/SignInService.java | 6 +- .../auth/service/SignUpService.java | 6 +- .../auth/service/TokenProvider.java | 32 ++- .../security/filter/SignOutCheckFilter.java | 12 +- .../auth/service/TokenProviderTest.java | 182 +++++++++++++----- .../e2e/ApplicantsQueryTest.java | 15 +- .../solidconnection/e2e/MyPageTest.java | 6 +- .../solidconnection/e2e/MyPageUpdateTest.java | 6 +- .../e2e/UniversityDetailTest.java | 8 +- .../e2e/UniversityLikeTest.java | 10 +- .../e2e/UniversityRecommendTest.java | 6 +- .../e2e/UniversitySearchTest.java | 6 +- 13 files changed, 203 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/example/solidconnection/auth/service/AuthService.java b/src/main/java/com/example/solidconnection/auth/service/AuthService.java index aed6f922f..7a67c4bbc 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthService.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthService.java @@ -5,24 +5,18 @@ import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.siteuser.domain.SiteUser; import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.ObjectUtils; import java.time.LocalDate; -import java.util.concurrent.TimeUnit; +import java.util.Optional; -import static com.example.solidconnection.auth.domain.TokenType.ACCESS; -import static com.example.solidconnection.auth.domain.TokenType.BLACKLIST; -import static com.example.solidconnection.auth.domain.TokenType.REFRESH; import static com.example.solidconnection.custom.exception.ErrorCode.REFRESH_TOKEN_EXPIRED; @RequiredArgsConstructor @Service public class AuthService { - private final RedisTemplate redisTemplate; private final TokenProvider tokenProvider; /* @@ -30,12 +24,7 @@ public class AuthService { * - 엑세스 토큰을 블랙리스트에 추가한다. * */ public void signOut(String accessToken) { - redisTemplate.opsForValue().set( - BLACKLIST.addPrefixToSubject(accessToken), - accessToken, - BLACKLIST.getExpireTime(), - TimeUnit.MILLISECONDS - ); + tokenProvider.generateAndSaveBlackListToken(accessToken); } /* @@ -56,14 +45,12 @@ public void quit(SiteUser siteUser) { * */ public ReissueResponse reissue(String subject) { // 리프레시 토큰 만료 확인 - String refreshTokenKey = REFRESH.addPrefixToSubject(subject); - String refreshToken = redisTemplate.opsForValue().get(refreshTokenKey); - if (ObjectUtils.isEmpty(refreshToken)) { + Optional optionalRefreshToken = tokenProvider.findRefreshToken(subject); + if (optionalRefreshToken.isEmpty()) { throw new CustomException(REFRESH_TOKEN_EXPIRED); } // 액세스 토큰 재발급 - String newAccessToken = tokenProvider.generateToken(subject, ACCESS); - tokenProvider.saveToken(newAccessToken, ACCESS); + String newAccessToken = tokenProvider.generateAccessToken(subject); return new ReissueResponse(newAccessToken); } } diff --git a/src/main/java/com/example/solidconnection/auth/service/SignInService.java b/src/main/java/com/example/solidconnection/auth/service/SignInService.java index ae4947596..52579ece9 100644 --- a/src/main/java/com/example/solidconnection/auth/service/SignInService.java +++ b/src/main/java/com/example/solidconnection/auth/service/SignInService.java @@ -60,12 +60,12 @@ private void resetQuitedAt(SiteUser siteUser) { } private SignInResponse getSignInInfo(SiteUser siteUser) { - String accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + String accessToken = tokenProvider.generateAccessToken(siteUser); + String refreshToken = tokenProvider.generateAndSaveRefreshToken(siteUser); return new SignInResponse(true, accessToken, refreshToken); } + // todo: SignUpTokenProvider 를 만들어서 거기에만 의존하도록 변경 필요 private FirstAccessResponse getFirstAccessInfo(KakaoUserInfoDto kakaoUserInfoDto) { String kakaoOauthToken = tokenProvider.generateToken(kakaoUserInfoDto.kakaoAccountDto().email(), TokenType.KAKAO_OAUTH); tokenProvider.saveToken(kakaoOauthToken, TokenType.KAKAO_OAUTH); diff --git a/src/main/java/com/example/solidconnection/auth/service/SignUpService.java b/src/main/java/com/example/solidconnection/auth/service/SignUpService.java index 697cdbdc0..043b318bf 100644 --- a/src/main/java/com/example/solidconnection/auth/service/SignUpService.java +++ b/src/main/java/com/example/solidconnection/auth/service/SignUpService.java @@ -2,7 +2,6 @@ import com.example.solidconnection.auth.dto.SignUpRequest; import com.example.solidconnection.auth.dto.SignUpResponse; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.custom.exception.CustomException; import com.example.solidconnection.entity.InterestedCountry; import com.example.solidconnection.entity.InterestedRegion; @@ -64,9 +63,8 @@ public SignUpResponse signUp(SignUpRequest signUpRequest) { saveInterestedCountry(signUpRequest, savedSiteUser); // 토큰 발급 - String accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + String accessToken = tokenProvider.generateAccessToken(siteUser); + String refreshToken = tokenProvider.generateAndSaveRefreshToken(siteUser); return new SignUpResponse(accessToken, refreshToken); } diff --git a/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java index 2dbf288ad..c870ce46b 100644 --- a/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; import java.util.Date; +import java.util.Optional; import java.util.concurrent.TimeUnit; import static com.example.solidconnection.util.JwtUtils.parseSubject; @@ -23,11 +24,37 @@ public class TokenProvider { private final RedisTemplate redisTemplate; private final JwtProperties jwtProperties; - public String generateToken(SiteUser siteUser, TokenType tokenType) { + public String generateAccessToken(SiteUser siteUser) { String subject = siteUser.getId().toString(); - return generateToken(subject, tokenType); + return generateToken(subject, TokenType.ACCESS); } + public String generateAccessToken(String subject) { + return generateToken(subject, TokenType.ACCESS); + } + + public String generateAndSaveRefreshToken(SiteUser siteUser) { + String subject = siteUser.getId().toString(); + String refreshToken = generateToken(subject, TokenType.REFRESH); + return saveToken(refreshToken, TokenType.REFRESH); + } + + public String generateAndSaveBlackListToken(String accessToken) { + String refreshToken = generateToken(accessToken, TokenType.BLACKLIST); + return saveToken(refreshToken, TokenType.BLACKLIST); + } + + public Optional findRefreshToken(String subject) { + String refreshTokenKey = TokenType.REFRESH.addPrefixToSubject(subject); + return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); + } + + public Optional findBlackListToken(String subject) { + String refreshTokenKey = TokenType.BLACKLIST.addPrefixToSubject(subject); + return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); + } + + // todo: SignUpTokenProvider 가 생기면 private 으로 변경 public String generateToken(String string, TokenType tokenType) { Claims claims = Jwts.claims().setSubject(string); Date now = new Date(); @@ -40,6 +67,7 @@ public String generateToken(String string, TokenType tokenType) { .compact(); } + // todo: SignUpTokenProvider 가 생기면 private 으로 변경 public String saveToken(String token, TokenType tokenType) { String subject = parseSubject(token, jwtProperties.secret()); redisTemplate.opsForValue().set( diff --git a/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java b/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java index 90fb6866e..165ecf03f 100644 --- a/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java +++ b/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java @@ -1,6 +1,6 @@ package com.example.solidconnection.custom.security.filter; -import com.example.solidconnection.config.security.JwtProperties; +import com.example.solidconnection.auth.service.TokenProvider; import com.example.solidconnection.custom.exception.CustomException; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -8,13 +8,12 @@ import jakarta.servlet.http.HttpServletResponse; import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; +import java.util.Optional; -import static com.example.solidconnection.auth.domain.TokenType.BLACKLIST; import static com.example.solidconnection.custom.exception.ErrorCode.USER_ALREADY_SIGN_OUT; import static com.example.solidconnection.util.JwtUtils.parseTokenFromRequest; @@ -22,8 +21,7 @@ @RequiredArgsConstructor public class SignOutCheckFilter extends OncePerRequestFilter { - private final RedisTemplate redisTemplate; - private final JwtProperties jwtProperties; + private final TokenProvider tokenProvider; @Override protected void doFilterInternal(@NonNull HttpServletRequest request, @@ -37,7 +35,7 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, } private boolean hasSignedOut(String accessToken) { - String blacklistKey = BLACKLIST.addPrefixToSubject(accessToken); - return redisTemplate.opsForValue().get(blacklistKey) != null; + Optional blackListToken = tokenProvider.findBlackListToken(accessToken); + return blackListToken.isPresent(); } } diff --git a/src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java index 8cc91e2c0..c2a938afb 100644 --- a/src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java @@ -2,21 +2,25 @@ import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.config.security.JwtProperties; -import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.custom.exception.ErrorCode; +import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.type.Gender; +import com.example.solidconnection.type.PreparationStatus; +import com.example.solidconnection.type.Role; +import com.example.solidconnection.util.JwtUtils; import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; -import java.util.Date; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; +import static org.junit.jupiter.api.Assertions.assertAll; @TestContainerSpringBootTest @DisplayName("TokenProvider 테스트") @@ -24,72 +28,160 @@ class TokenProviderTest { @Autowired private TokenProvider tokenProvider; + + @Autowired + private SiteUserRepository siteUserRepository; @Autowired private RedisTemplate redisTemplate; @Autowired private JwtProperties jwtProperties; + + private SiteUser siteUser; + private String subject; + + @BeforeEach + void setUp() { + siteUser = createSiteUser(); + siteUserRepository.save(siteUser); + subject = siteUser.getId().toString(); + } - @Test - void 토큰을_생성한다() { - // when - String subject = "subject123"; - String token = tokenProvider.generateToken(subject, TokenType.ACCESS); + @Nested + class 액세스_토큰을_제공한다 { + + @Test + void SiteUser_로_액세스_토큰을_생성한다() { + // when + String token = tokenProvider.generateAccessToken(siteUser); - // then - String extractedSubject = Jwts.parser() - .setSigningKey(jwtProperties.secret()) - .parseClaimsJws(token) - .getBody() - .getSubject(); - assertThat(subject).isEqualTo(extractedSubject); - } + // then + String actualSubject = JwtUtils.parseSubject(token, jwtProperties.secret()); + assertThat(actualSubject).isEqualTo(subject); + } + + @Test + void subject_로_액세스_토큰을_생성한다() { + // given + String subject = "subject123"; + // when + String token = tokenProvider.generateAccessToken(subject); + + // then + String actualSubject = JwtUtils.parseSubject(token, jwtProperties.secret()); + assertThat(actualSubject).isEqualTo(subject); + } + } + @Nested - class 토큰을_저장한다 { + class 리프레시_토큰을_제공한다 { + + @Test + void SiteUser_로_리프레시_토큰을_생성하고_저장한다() { + // when + String refreshToken = tokenProvider.generateAndSaveRefreshToken(siteUser); + + // then + String actualSubject = JwtUtils.parseSubject(refreshToken, jwtProperties.secret()); + String refreshTokenKey = TokenType.REFRESH.addPrefixToSubject(subject); + assertAll( + () -> assertThat(actualSubject).isEqualTo(subject), + () -> assertThat(redisTemplate.opsForValue().get(refreshTokenKey)).isEqualTo(refreshToken) + ); + } @Test - void 토큰이_유효하면_저장한다() { + void 저장된_리프레시_토큰을_조회한다() { // given - String subject = "subject321"; - String token = createValidToken(subject); + String refreshToken = "refreshToken"; + redisTemplate.opsForValue().set(TokenType.REFRESH.addPrefixToSubject(subject), refreshToken); + + // when + Optional optionalRefreshToken = tokenProvider.findRefreshToken(subject); + // then + assertThat(optionalRefreshToken.get()).isEqualTo(refreshToken); + } + + @Test + void 저장되지_않은_리프레시_토큰을_조회한다() { + // when + Optional optionalRefreshToken = tokenProvider.findRefreshToken(subject); + + // then + assertThat(optionalRefreshToken).isEmpty(); + } + } + + @Nested + class 블랙리스트_토큰을_제공한다 { + + @Test + void 엑세스_토큰으로_블랙리스트_토큰을_생성하고_저장한다() { // when - tokenProvider.saveToken(token, TokenType.ACCESS); + String accessToken = "accessToken"; + String blackListToken = tokenProvider.generateAndSaveBlackListToken(accessToken); // then - String savedToken = redisTemplate.opsForValue().get(TokenType.ACCESS.addPrefixToSubject(subject)); - assertThat(savedToken).isEqualTo(token); + String actualSubject = JwtUtils.parseSubject(blackListToken, jwtProperties.secret()); + String blackListTokenKey = TokenType.BLACKLIST.addPrefixToSubject(accessToken); + assertAll( + () -> assertThat(actualSubject).isEqualTo(accessToken), + () -> assertThat(redisTemplate.opsForValue().get(blackListTokenKey)).isEqualTo(blackListToken) + ); } @Test - void 토큰이_유효하지않으면_예외가_발생한다() { + void 저장된_블랙리스트_토큰을_조회한다() { // given - String token = createInvalidToken(); + String accessToken = "accessToken"; + String blackListToken = "token"; + redisTemplate.opsForValue().set(TokenType.BLACKLIST.addPrefixToSubject(accessToken), blackListToken); - // when & then - assertThatCode(() -> tokenProvider.saveToken(token, TokenType.REFRESH)) - .isInstanceOf(CustomException.class) - .hasMessage(ErrorCode.INVALID_TOKEN.getMessage()); + // when + Optional optionalBlackListToken = tokenProvider.findBlackListToken(accessToken); + + // then + assertThat(optionalBlackListToken.get()).isEqualTo(blackListToken); + } + + @Test + void 저장되지_않은_블랙리스트_토큰을_조회한다() { + // when + Optional optionalBlackListToken = tokenProvider.findBlackListToken("accessToken"); + + // then + assertThat(optionalBlackListToken).isEmpty(); } } - private String createValidToken(String subject) { - return Jwts.builder() - .setSubject(subject) - .setIssuedAt(new Date()) - .setExpiration(new Date(System.currentTimeMillis() + 1000)) - .signWith(SignatureAlgorithm.HS256, jwtProperties.secret()) - .compact(); + @Test + void 토큰을_생성한다() { + // when + String subject = "subject123"; + String token = tokenProvider.generateToken(subject, TokenType.ACCESS); + + // then + String extractedSubject = Jwts.parser() + .setSigningKey(jwtProperties.secret()) + .parseClaimsJws(token) + .getBody() + .getSubject(); + assertThat(subject).isEqualTo(extractedSubject); } - private String createInvalidToken() { - return Jwts.builder() - .setSubject("subject") - .setIssuedAt(new Date()) - .setExpiration(new Date(System.currentTimeMillis() - 1000)) - .signWith(SignatureAlgorithm.HS256, jwtProperties.secret()) - .compact(); + private SiteUser createSiteUser() { + SiteUser siteUser = new SiteUser( + "test@example.com", + "nickname", + "profileImageUrl", + "1999-01-01", + PreparationStatus.CONSIDERING, + Role.MENTEE, + Gender.MALE + ); + return siteUserRepository.save(siteUser); } } diff --git a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java index 40f39e646..ab65aea4a 100644 --- a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java +++ b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java @@ -65,17 +65,14 @@ public void setUpUserAndToken() { SiteUser 사용자6 = siteUserRepository.save(createSiteUserByEmail("email6")); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(나, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(나, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(나); + tokenProvider.generateAndSaveRefreshToken(나); - adminAccessToken = tokenProvider.generateToken(사용자5_관리자, TokenType.ACCESS); - String adminRefreshToken = tokenProvider.generateToken(사용자5_관리자, TokenType.REFRESH); - tokenProvider.saveToken(adminRefreshToken, TokenType.REFRESH); + adminAccessToken = tokenProvider.generateAccessToken(사용자5_관리자); + tokenProvider.generateAndSaveRefreshToken(사용자5_관리자); - user6AccessToken = tokenProvider.generateToken(사용자6, TokenType.ACCESS); - String user6RefreshToken = tokenProvider.generateToken(사용자6, TokenType.REFRESH); - tokenProvider.saveToken(user6RefreshToken, TokenType.REFRESH); + user6AccessToken = tokenProvider.generateAccessToken(사용자6); + tokenProvider.generateAndSaveRefreshToken(사용자6); // setUp - 지원 정보 저장 Gpa gpa = createDummyGpa(); diff --git a/src/test/java/com/example/solidconnection/e2e/MyPageTest.java b/src/test/java/com/example/solidconnection/e2e/MyPageTest.java index 567b1016d..5178fc933 100644 --- a/src/test/java/com/example/solidconnection/e2e/MyPageTest.java +++ b/src/test/java/com/example/solidconnection/e2e/MyPageTest.java @@ -1,7 +1,6 @@ package com.example.solidconnection.e2e; import com.example.solidconnection.auth.service.TokenProvider; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.dto.MyPageResponse; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -35,9 +34,8 @@ public void setUpUserAndToken() { siteUser = siteUserRepository.save(createSiteUserByEmail("email")); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(siteUser); + tokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java b/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java index 025ddb7d7..df571438d 100644 --- a/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java +++ b/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java @@ -1,7 +1,6 @@ package com.example.solidconnection.e2e; import com.example.solidconnection.auth.service.TokenProvider; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.custom.response.ErrorResponse; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.dto.MyPageUpdateResponse; @@ -44,9 +43,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(siteUser); + tokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java index b7e112d00..7c4445151 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java @@ -1,7 +1,6 @@ package com.example.solidconnection.e2e; import com.example.solidconnection.auth.service.TokenProvider; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.dto.LanguageRequirementResponse; @@ -36,11 +35,10 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(siteUser); + tokenProvider.generateAndSaveRefreshToken(siteUser); } - + @Test void 대학교_정보를_조회한다() { // request - 요청 diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java index 301b373c4..707ee3968 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java @@ -1,7 +1,6 @@ package com.example.solidconnection.e2e; import com.example.solidconnection.auth.service.TokenProvider; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.LikedUniversityRepository; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -28,7 +27,7 @@ import static com.example.solidconnection.university.service.UniversityLikeService.LIKE_CANCELED_MESSAGE; import static com.example.solidconnection.university.service.UniversityLikeService.LIKE_SUCCESS_MESSAGE; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; @DisplayName("대학교 좋아요 테스트") class UniversityLikeTest extends UniversityDataSetUpEndToEndTest { @@ -55,9 +54,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(siteUser); + tokenProvider.generateAndSaveRefreshToken(siteUser); } @Test @@ -138,7 +136,7 @@ public void setUpUserAndToken() { // request - 요청 IsLikeResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) - .get("/university/"+ 괌대학_A_지원_정보.getId() +"/like") + .get("/university/" + 괌대학_A_지원_정보.getId() + "/like") .then().log().all() .statusCode(HttpStatus.OK.value()) .extract().as(IsLikeResponse.class); diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java index 358f779cd..bf58c13e4 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java @@ -1,7 +1,6 @@ package com.example.solidconnection.e2e; import com.example.solidconnection.auth.service.TokenProvider; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.entity.InterestedCountry; import com.example.solidconnection.entity.InterestedRegion; import com.example.solidconnection.repositories.InterestedCountyRepository; @@ -54,9 +53,8 @@ void setUp() { generalUniversityRecommendService.init(); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(siteUser); + tokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java b/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java index 22abbfb53..a8bcc6f8d 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java @@ -1,6 +1,5 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.auth.service.TokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -35,9 +34,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateToken(siteUser, TokenType.ACCESS); - String refreshToken = tokenProvider.generateToken(siteUser, TokenType.REFRESH); - tokenProvider.saveToken(refreshToken, TokenType.REFRESH); + accessToken = tokenProvider.generateAccessToken(siteUser); + tokenProvider.generateAndSaveRefreshToken(siteUser); } @Test From 77513c79e0b17a01ee74e4ddef9c0c1e8e1a7fc5 Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 6 Feb 2025 09:34:53 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20SignUpTokenProvider=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1,=20TokenProvider=20=EC=B6=94=EC=83=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/domain/TokenType.java | 4 +- .../auth/service/AuthService.java | 8 +-- .../auth/service/AuthTokenProvider.java | 53 ++++++++++++++ .../auth/service/SignInService.java | 11 ++- .../auth/service/SignUpService.java | 8 +-- .../auth/service/SignUpTokenProvider.java | 26 +++++++ .../auth/service/TokenProvider.java | 54 +++----------- .../auth/service/TokenValidator.java | 8 +-- .../security/filter/SignOutCheckFilter.java | 6 +- ...erTest.java => AuthTokenProviderTest.java} | 26 +++---- .../auth/service/SignUpTokenProviderTest.java | 70 +++++++++++++++++++ .../e2e/ApplicantsQueryTest.java | 17 +++-- .../solidconnection/e2e/MyPageTest.java | 8 +-- .../solidconnection/e2e/MyPageUpdateTest.java | 8 +-- .../solidconnection/e2e/SignInTest.java | 4 +- .../solidconnection/e2e/SignUpTest.java | 18 ++--- .../e2e/UniversityDetailTest.java | 8 +-- .../e2e/UniversityLikeTest.java | 8 +-- .../e2e/UniversityRecommendTest.java | 8 +-- .../e2e/UniversitySearchTest.java | 8 +-- 20 files changed, 235 insertions(+), 126 deletions(-) create mode 100644 src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java create mode 100644 src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java rename src/test/java/com/example/solidconnection/auth/service/{TokenProviderTest.java => AuthTokenProviderTest.java} (84%) create mode 100644 src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java diff --git a/src/main/java/com/example/solidconnection/auth/domain/TokenType.java b/src/main/java/com/example/solidconnection/auth/domain/TokenType.java index ad5607a27..c06a6e6fb 100644 --- a/src/main/java/com/example/solidconnection/auth/domain/TokenType.java +++ b/src/main/java/com/example/solidconnection/auth/domain/TokenType.java @@ -7,8 +7,8 @@ public enum TokenType { ACCESS("ACCESS:", 1000 * 60 * 60), // 1hour REFRESH("REFRESH:", 1000 * 60 * 60 * 24 * 7), // 7days - KAKAO_OAUTH("KAKAO:", 1000 * 60 * 60), // 1hour - BLACKLIST("BLACKLIST:", ACCESS.expireTime) + BLACKLIST("BLACKLIST:", ACCESS.expireTime), + SIGN_UP("SIGN_UP:", 1000 * 60 * 10), // 10min ; private final String prefix; diff --git a/src/main/java/com/example/solidconnection/auth/service/AuthService.java b/src/main/java/com/example/solidconnection/auth/service/AuthService.java index 7a67c4bbc..04bcadde7 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthService.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthService.java @@ -17,14 +17,14 @@ @Service public class AuthService { - private final TokenProvider tokenProvider; + private final AuthTokenProvider authTokenProvider; /* * 로그아웃 한다. * - 엑세스 토큰을 블랙리스트에 추가한다. * */ public void signOut(String accessToken) { - tokenProvider.generateAndSaveBlackListToken(accessToken); + authTokenProvider.generateAndSaveBlackListToken(accessToken); } /* @@ -45,12 +45,12 @@ public void quit(SiteUser siteUser) { * */ public ReissueResponse reissue(String subject) { // 리프레시 토큰 만료 확인 - Optional optionalRefreshToken = tokenProvider.findRefreshToken(subject); + Optional optionalRefreshToken = authTokenProvider.findRefreshToken(subject); if (optionalRefreshToken.isEmpty()) { throw new CustomException(REFRESH_TOKEN_EXPIRED); } // 액세스 토큰 재발급 - String newAccessToken = tokenProvider.generateAccessToken(subject); + String newAccessToken = authTokenProvider.generateAccessToken(subject); return new ReissueResponse(newAccessToken); } } diff --git a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java new file mode 100644 index 000000000..1a4122472 --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java @@ -0,0 +1,53 @@ +package com.example.solidconnection.auth.service; + +import com.example.solidconnection.auth.domain.TokenType; +import com.example.solidconnection.config.security.JwtProperties; +import com.example.solidconnection.siteuser.domain.SiteUser; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +import static com.example.solidconnection.util.JwtUtils.parseSubjectIgnoringExpiration; + +@Component +public class AuthTokenProvider extends TokenProvider { + + public AuthTokenProvider(JwtProperties jwtProperties, RedisTemplate redisTemplate) { + super(jwtProperties, redisTemplate); + } + + public String generateAccessToken(SiteUser siteUser) { + String subject = siteUser.getId().toString(); + return generateToken(subject, TokenType.ACCESS); + } + + public String generateAccessToken(String subject) { + return generateToken(subject, TokenType.ACCESS); + } + + public String generateAndSaveRefreshToken(SiteUser siteUser) { + String subject = siteUser.getId().toString(); + String refreshToken = generateToken(subject, TokenType.REFRESH); + return saveToken(refreshToken, TokenType.REFRESH); + } + + public String generateAndSaveBlackListToken(String accessToken) { + String refreshToken = generateToken(accessToken, TokenType.BLACKLIST); + return saveToken(refreshToken, TokenType.BLACKLIST); + } + + public Optional findRefreshToken(String subject) { + String refreshTokenKey = TokenType.REFRESH.addPrefixToSubject(subject); + return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); + } + + public Optional findBlackListToken(String subject) { + String refreshTokenKey = TokenType.BLACKLIST.addPrefixToSubject(subject); + return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); + } + + public String getEmail(String token) { + return parseSubjectIgnoringExpiration(token, jwtProperties.secret()); + } +} diff --git a/src/main/java/com/example/solidconnection/auth/service/SignInService.java b/src/main/java/com/example/solidconnection/auth/service/SignInService.java index 52579ece9..e740c7625 100644 --- a/src/main/java/com/example/solidconnection/auth/service/SignInService.java +++ b/src/main/java/com/example/solidconnection/auth/service/SignInService.java @@ -6,7 +6,6 @@ import com.example.solidconnection.auth.dto.kakao.KakaoCodeRequest; import com.example.solidconnection.auth.dto.kakao.KakaoOauthResponse; import com.example.solidconnection.auth.dto.kakao.KakaoUserInfoDto; -import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.siteuser.domain.AuthType; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -20,7 +19,8 @@ @Service public class SignInService { - private final TokenProvider tokenProvider; + private final AuthTokenProvider authTokenProvider; + private final SignUpTokenProvider signUpTokenProvider; private final SiteUserRepository siteUserRepository; private final KakaoOAuthClient kakaoOAuthClient; @@ -60,15 +60,14 @@ private void resetQuitedAt(SiteUser siteUser) { } private SignInResponse getSignInInfo(SiteUser siteUser) { - String accessToken = tokenProvider.generateAccessToken(siteUser); - String refreshToken = tokenProvider.generateAndSaveRefreshToken(siteUser); + String accessToken = authTokenProvider.generateAccessToken(siteUser); + String refreshToken = authTokenProvider.generateAndSaveRefreshToken(siteUser); return new SignInResponse(true, accessToken, refreshToken); } // todo: SignUpTokenProvider 를 만들어서 거기에만 의존하도록 변경 필요 private FirstAccessResponse getFirstAccessInfo(KakaoUserInfoDto kakaoUserInfoDto) { - String kakaoOauthToken = tokenProvider.generateToken(kakaoUserInfoDto.kakaoAccountDto().email(), TokenType.KAKAO_OAUTH); - tokenProvider.saveToken(kakaoOauthToken, TokenType.KAKAO_OAUTH); + String kakaoOauthToken = signUpTokenProvider.generateAndSaveSignUpToken(kakaoUserInfoDto.kakaoAccountDto().email()); return FirstAccessResponse.of(kakaoUserInfoDto, kakaoOauthToken); } } diff --git a/src/main/java/com/example/solidconnection/auth/service/SignUpService.java b/src/main/java/com/example/solidconnection/auth/service/SignUpService.java index 043b318bf..788b07e44 100644 --- a/src/main/java/com/example/solidconnection/auth/service/SignUpService.java +++ b/src/main/java/com/example/solidconnection/auth/service/SignUpService.java @@ -27,7 +27,7 @@ public class SignUpService { private final TokenValidator tokenValidator; - private final TokenProvider tokenProvider; + private final AuthTokenProvider authTokenProvider; private final SiteUserRepository siteUserRepository; private final RegionRepository regionRepository; private final InterestedRegionRepository interestedRegionRepository; @@ -50,7 +50,7 @@ public class SignUpService { public SignUpResponse signUp(SignUpRequest signUpRequest) { // 검증 tokenValidator.validateKakaoToken(signUpRequest.kakaoOauthToken()); - String email = tokenProvider.getEmail(signUpRequest.kakaoOauthToken()); + String email = authTokenProvider.getEmail(signUpRequest.kakaoOauthToken()); validateNicknameDuplicated(signUpRequest.nickname()); validateUserNotDuplicated(email); @@ -63,8 +63,8 @@ public SignUpResponse signUp(SignUpRequest signUpRequest) { saveInterestedCountry(signUpRequest, savedSiteUser); // 토큰 발급 - String accessToken = tokenProvider.generateAccessToken(siteUser); - String refreshToken = tokenProvider.generateAndSaveRefreshToken(siteUser); + String accessToken = authTokenProvider.generateAccessToken(siteUser); + String refreshToken = authTokenProvider.generateAndSaveRefreshToken(siteUser); return new SignUpResponse(accessToken, refreshToken); } diff --git a/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java new file mode 100644 index 000000000..5bacfdd05 --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java @@ -0,0 +1,26 @@ +package com.example.solidconnection.auth.service; + +import com.example.solidconnection.auth.domain.TokenType; +import com.example.solidconnection.config.security.JwtProperties; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public class SignUpTokenProvider extends TokenProvider { + + public SignUpTokenProvider(JwtProperties jwtProperties, RedisTemplate redisTemplate) { + super(jwtProperties, redisTemplate); + } + + public String generateAndSaveSignUpToken(String email) { + String signUpToken = generateToken(email, TokenType.SIGN_UP); + return saveToken(signUpToken, TokenType.SIGN_UP); + } + + public Optional findSignUpToken(String email) { + String signUpKey = TokenType.SIGN_UP.addPrefixToSubject(email); + return Optional.ofNullable(redisTemplate.opsForValue().get(signUpKey)); + } +} diff --git a/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java index c870ce46b..9f0712893 100644 --- a/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java @@ -2,60 +2,27 @@ import com.example.solidconnection.auth.domain.TokenType; import com.example.solidconnection.config.security.JwtProperties; -import com.example.solidconnection.siteuser.domain.SiteUser; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; -import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Component; import java.util.Date; -import java.util.Optional; import java.util.concurrent.TimeUnit; import static com.example.solidconnection.util.JwtUtils.parseSubject; -import static com.example.solidconnection.util.JwtUtils.parseSubjectIgnoringExpiration; -@RequiredArgsConstructor -@Component -public class TokenProvider { +public abstract class TokenProvider { - private final RedisTemplate redisTemplate; - private final JwtProperties jwtProperties; + protected final JwtProperties jwtProperties; + protected final RedisTemplate redisTemplate; - public String generateAccessToken(SiteUser siteUser) { - String subject = siteUser.getId().toString(); - return generateToken(subject, TokenType.ACCESS); + public TokenProvider(JwtProperties jwtProperties, RedisTemplate redisTemplate) { + this.jwtProperties = jwtProperties; + this.redisTemplate = redisTemplate; } - public String generateAccessToken(String subject) { - return generateToken(subject, TokenType.ACCESS); - } - - public String generateAndSaveRefreshToken(SiteUser siteUser) { - String subject = siteUser.getId().toString(); - String refreshToken = generateToken(subject, TokenType.REFRESH); - return saveToken(refreshToken, TokenType.REFRESH); - } - - public String generateAndSaveBlackListToken(String accessToken) { - String refreshToken = generateToken(accessToken, TokenType.BLACKLIST); - return saveToken(refreshToken, TokenType.BLACKLIST); - } - - public Optional findRefreshToken(String subject) { - String refreshTokenKey = TokenType.REFRESH.addPrefixToSubject(subject); - return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); - } - - public Optional findBlackListToken(String subject) { - String refreshTokenKey = TokenType.BLACKLIST.addPrefixToSubject(subject); - return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); - } - - // todo: SignUpTokenProvider 가 생기면 private 으로 변경 - public String generateToken(String string, TokenType tokenType) { + protected final String generateToken(String string, TokenType tokenType) { Claims claims = Jwts.claims().setSubject(string); Date now = new Date(); Date expiredDate = new Date(now.getTime() + tokenType.getExpireTime()); @@ -67,8 +34,7 @@ public String generateToken(String string, TokenType tokenType) { .compact(); } - // todo: SignUpTokenProvider 가 생기면 private 으로 변경 - public String saveToken(String token, TokenType tokenType) { + protected final String saveToken(String token, TokenType tokenType) { String subject = parseSubject(token, jwtProperties.secret()); redisTemplate.opsForValue().set( tokenType.addPrefixToSubject(subject), @@ -78,8 +44,4 @@ public String saveToken(String token, TokenType tokenType) { ); return token; } - - public String getEmail(String token) { - return parseSubjectIgnoringExpiration(token, jwtProperties.secret()); - } } diff --git a/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java b/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java index 8c17ad00c..bc579c598 100644 --- a/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java +++ b/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java @@ -14,8 +14,8 @@ import java.util.Objects; import static com.example.solidconnection.auth.domain.TokenType.ACCESS; -import static com.example.solidconnection.auth.domain.TokenType.KAKAO_OAUTH; import static com.example.solidconnection.auth.domain.TokenType.REFRESH; +import static com.example.solidconnection.auth.domain.TokenType.SIGN_UP; import static com.example.solidconnection.custom.exception.ErrorCode.ACCESS_TOKEN_EXPIRED; import static com.example.solidconnection.custom.exception.ErrorCode.EMPTY_TOKEN; import static com.example.solidconnection.custom.exception.ErrorCode.INVALID_SERVICE_PUBLISHED_KAKAO_TOKEN; @@ -38,7 +38,7 @@ public void validateAccessToken(String token) { public void validateKakaoToken(String token) { validateTokenNotEmpty(token); - validateTokenNotExpired(token, KAKAO_OAUTH); + validateTokenNotExpired(token, SIGN_UP); validateKakaoTokenNotUsed(token); } @@ -55,7 +55,7 @@ private void validateTokenNotExpired(String token, TokenType tokenType) { if (tokenType.equals(ACCESS)) { throw new CustomException(ACCESS_TOKEN_EXPIRED); } - if (token.equals(KAKAO_OAUTH)) { + if (token.equals(SIGN_UP)) { throw new CustomException(INVALID_SERVICE_PUBLISHED_KAKAO_TOKEN); } } @@ -70,7 +70,7 @@ private void validateRefreshToken(String token) { private void validateKakaoTokenNotUsed(String token) { String email = getClaim(token).getSubject(); - if (!Objects.equals(redisTemplate.opsForValue().get(KAKAO_OAUTH.addPrefixToSubject(email)), token)) { + if (!Objects.equals(redisTemplate.opsForValue().get(SIGN_UP.addPrefixToSubject(email)), token)) { throw new CustomException(INVALID_SERVICE_PUBLISHED_KAKAO_TOKEN); } } diff --git a/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java b/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java index 165ecf03f..b307ecca2 100644 --- a/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java +++ b/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java @@ -1,6 +1,6 @@ package com.example.solidconnection.custom.security.filter; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.custom.exception.CustomException; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; @@ -21,7 +21,7 @@ @RequiredArgsConstructor public class SignOutCheckFilter extends OncePerRequestFilter { - private final TokenProvider tokenProvider; + private final AuthTokenProvider authTokenProvider; @Override protected void doFilterInternal(@NonNull HttpServletRequest request, @@ -35,7 +35,7 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, } private boolean hasSignedOut(String accessToken) { - Optional blackListToken = tokenProvider.findBlackListToken(accessToken); + Optional blackListToken = authTokenProvider.findBlackListToken(accessToken); return blackListToken.isPresent(); } } diff --git a/src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java similarity index 84% rename from src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java rename to src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java index c2a938afb..db4efa7d1 100644 --- a/src/test/java/com/example/solidconnection/auth/service/TokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java @@ -23,11 +23,11 @@ import static org.junit.jupiter.api.Assertions.assertAll; @TestContainerSpringBootTest -@DisplayName("TokenProvider 테스트") -class TokenProviderTest { +@DisplayName("인증 토큰 제공자 테스트") +class AuthTokenProviderTest { @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; @Autowired private SiteUserRepository siteUserRepository; @@ -54,7 +54,7 @@ class 액세스_토큰을_제공한다 { @Test void SiteUser_로_액세스_토큰을_생성한다() { // when - String token = tokenProvider.generateAccessToken(siteUser); + String token = authTokenProvider.generateAccessToken(siteUser); // then String actualSubject = JwtUtils.parseSubject(token, jwtProperties.secret()); @@ -67,7 +67,7 @@ class 액세스_토큰을_제공한다 { String subject = "subject123"; // when - String token = tokenProvider.generateAccessToken(subject); + String token = authTokenProvider.generateAccessToken(subject); // then String actualSubject = JwtUtils.parseSubject(token, jwtProperties.secret()); @@ -81,7 +81,7 @@ class 리프레시_토큰을_제공한다 { @Test void SiteUser_로_리프레시_토큰을_생성하고_저장한다() { // when - String refreshToken = tokenProvider.generateAndSaveRefreshToken(siteUser); + String refreshToken = authTokenProvider.generateAndSaveRefreshToken(siteUser); // then String actualSubject = JwtUtils.parseSubject(refreshToken, jwtProperties.secret()); @@ -99,7 +99,7 @@ class 리프레시_토큰을_제공한다 { redisTemplate.opsForValue().set(TokenType.REFRESH.addPrefixToSubject(subject), refreshToken); // when - Optional optionalRefreshToken = tokenProvider.findRefreshToken(subject); + Optional optionalRefreshToken = authTokenProvider.findRefreshToken(subject); // then assertThat(optionalRefreshToken.get()).isEqualTo(refreshToken); @@ -108,7 +108,7 @@ class 리프레시_토큰을_제공한다 { @Test void 저장되지_않은_리프레시_토큰을_조회한다() { // when - Optional optionalRefreshToken = tokenProvider.findRefreshToken(subject); + Optional optionalRefreshToken = authTokenProvider.findRefreshToken(subject); // then assertThat(optionalRefreshToken).isEmpty(); @@ -122,7 +122,7 @@ class 블랙리스트_토큰을_제공한다 { void 엑세스_토큰으로_블랙리스트_토큰을_생성하고_저장한다() { // when String accessToken = "accessToken"; - String blackListToken = tokenProvider.generateAndSaveBlackListToken(accessToken); + String blackListToken = authTokenProvider.generateAndSaveBlackListToken(accessToken); // then String actualSubject = JwtUtils.parseSubject(blackListToken, jwtProperties.secret()); @@ -141,16 +141,16 @@ class 블랙리스트_토큰을_제공한다 { redisTemplate.opsForValue().set(TokenType.BLACKLIST.addPrefixToSubject(accessToken), blackListToken); // when - Optional optionalBlackListToken = tokenProvider.findBlackListToken(accessToken); + Optional optionalBlackListToken = authTokenProvider.findBlackListToken(accessToken); // then - assertThat(optionalBlackListToken.get()).isEqualTo(blackListToken); + assertThat(optionalBlackListToken).hasValue(blackListToken); } @Test void 저장되지_않은_블랙리스트_토큰을_조회한다() { // when - Optional optionalBlackListToken = tokenProvider.findBlackListToken("accessToken"); + Optional optionalBlackListToken = authTokenProvider.findBlackListToken("accessToken"); // then assertThat(optionalBlackListToken).isEmpty(); @@ -161,7 +161,7 @@ class 블랙리스트_토큰을_제공한다 { void 토큰을_생성한다() { // when String subject = "subject123"; - String token = tokenProvider.generateToken(subject, TokenType.ACCESS); + String token = authTokenProvider.generateToken(subject, TokenType.ACCESS); // then String extractedSubject = Jwts.parser() diff --git a/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java new file mode 100644 index 000000000..3adbdf9ef --- /dev/null +++ b/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java @@ -0,0 +1,70 @@ +package com.example.solidconnection.auth.service; + +import com.example.solidconnection.auth.domain.TokenType; +import com.example.solidconnection.config.security.JwtProperties; +import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.util.JwtUtils; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +@TestContainerSpringBootTest +@DisplayName("회원가입 토큰 제공자 테스트") +class SignUpTokenProviderTest { + + @Autowired + private SignUpTokenProvider signUpTokenProvider; + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private JwtProperties jwtProperties; + + @Test + void 회원가입_토큰을_생성하고_저장한다() { + // when + String email = "email"; + String signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(email); + + // then + String actualSubject = JwtUtils.parseSubject(signUpToken, jwtProperties.secret()); + String signUpTokenKey = TokenType.SIGN_UP.addPrefixToSubject(email); + assertAll( + () -> assertThat(actualSubject).isEqualTo(email), + () -> assertThat(redisTemplate.opsForValue().get(signUpTokenKey)).isEqualTo(signUpToken) + ); + } + + @Test + void 저장된_회원가입_토큰을_조회한다() { + // given + String email = "email"; + String signUpToken = "token"; + redisTemplate.opsForValue().set(TokenType.SIGN_UP.addPrefixToSubject(email), signUpToken); + + // when + Optional actualSignUpToken = signUpTokenProvider.findSignUpToken(email); + + // then + assertThat(actualSignUpToken).hasValue(signUpToken); + } + + @Test + void 저장되지_않은_회원가입_토큰을_조회한다() { + // given + String email = "email"; + + // when + Optional actualSignUpToken = signUpTokenProvider.findSignUpToken(email); + + // then + assertThat(actualSignUpToken).isEmpty(); + } +} diff --git a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java index ab65aea4a..fa2cf0b0b 100644 --- a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java +++ b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java @@ -7,8 +7,7 @@ import com.example.solidconnection.application.dto.ApplicationsResponse; import com.example.solidconnection.application.dto.UniversityApplicantsResponse; import com.example.solidconnection.application.repository.ApplicationRepository; -import com.example.solidconnection.auth.domain.TokenType; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.type.VerifyStatus; @@ -36,7 +35,7 @@ class ApplicantsQueryTest extends UniversityDataSetUpEndToEndTest { private ApplicationRepository applicationRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; private String accessToken; private String adminAccessToken; @@ -65,14 +64,14 @@ public void setUpUserAndToken() { SiteUser 사용자6 = siteUserRepository.save(createSiteUserByEmail("email6")); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(나); - tokenProvider.generateAndSaveRefreshToken(나); + accessToken = authTokenProvider.generateAccessToken(나); + authTokenProvider.generateAndSaveRefreshToken(나); - adminAccessToken = tokenProvider.generateAccessToken(사용자5_관리자); - tokenProvider.generateAndSaveRefreshToken(사용자5_관리자); + adminAccessToken = authTokenProvider.generateAccessToken(사용자5_관리자); + authTokenProvider.generateAndSaveRefreshToken(사용자5_관리자); - user6AccessToken = tokenProvider.generateAccessToken(사용자6); - tokenProvider.generateAndSaveRefreshToken(사용자6); + user6AccessToken = authTokenProvider.generateAccessToken(사용자6); + authTokenProvider.generateAndSaveRefreshToken(사용자6); // setUp - 지원 정보 저장 Gpa gpa = createDummyGpa(); diff --git a/src/test/java/com/example/solidconnection/e2e/MyPageTest.java b/src/test/java/com/example/solidconnection/e2e/MyPageTest.java index 5178fc933..7a0ae07f4 100644 --- a/src/test/java/com/example/solidconnection/e2e/MyPageTest.java +++ b/src/test/java/com/example/solidconnection/e2e/MyPageTest.java @@ -1,6 +1,6 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.dto.MyPageResponse; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -24,7 +24,7 @@ class MyPageTest extends BaseEndToEndTest { private SiteUserRepository siteUserRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; private String accessToken; @@ -34,8 +34,8 @@ public void setUpUserAndToken() { siteUser = siteUserRepository.save(createSiteUserByEmail("email")); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(siteUser); - tokenProvider.generateAndSaveRefreshToken(siteUser); + accessToken = authTokenProvider.generateAccessToken(siteUser); + authTokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java b/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java index df571438d..b16f3b822 100644 --- a/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java +++ b/src/test/java/com/example/solidconnection/e2e/MyPageUpdateTest.java @@ -1,6 +1,6 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.custom.response.ErrorResponse; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.dto.MyPageUpdateResponse; @@ -30,7 +30,7 @@ class MyPageUpdateTest extends BaseEndToEndTest { private SiteUserRepository siteUserRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; private String accessToken; @@ -43,8 +43,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(siteUser); - tokenProvider.generateAndSaveRefreshToken(siteUser); + accessToken = authTokenProvider.generateAccessToken(siteUser); + authTokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/SignInTest.java b/src/test/java/com/example/solidconnection/e2e/SignInTest.java index 26eba657a..76933da76 100644 --- a/src/test/java/com/example/solidconnection/e2e/SignInTest.java +++ b/src/test/java/com/example/solidconnection/e2e/SignInTest.java @@ -18,8 +18,8 @@ import java.time.LocalDate; -import static com.example.solidconnection.auth.domain.TokenType.KAKAO_OAUTH; import static com.example.solidconnection.auth.domain.TokenType.REFRESH; +import static com.example.solidconnection.auth.domain.TokenType.SIGN_UP; import static com.example.solidconnection.e2e.DynamicFixture.createKakaoUserInfoDtoByEmail; import static com.example.solidconnection.e2e.DynamicFixture.createSiteUserByEmail; import static com.example.solidconnection.scheduler.UserRemovalScheduler.ACCOUNT_RECOVER_DURATION; @@ -65,7 +65,7 @@ class SignInTest extends BaseEndToEndTest { () -> assertThat(response.nickname()).isEqualTo(kakaoProfileDto.nickname()), () -> assertThat(response.profileImageUrl()).isEqualTo(kakaoProfileDto.profileImageUrl()), () -> assertThat(response.kakaoOauthToken()).isNotNull()); - assertThat(redisTemplate.opsForValue().get(KAKAO_OAUTH.addPrefixToSubject(email))) + assertThat(redisTemplate.opsForValue().get(SIGN_UP.addPrefixToSubject(email))) .as("카카오 인증 토큰을 저장한다.") .isEqualTo(response.kakaoOauthToken()); } diff --git a/src/test/java/com/example/solidconnection/e2e/SignUpTest.java b/src/test/java/com/example/solidconnection/e2e/SignUpTest.java index 1eb152387..ce71bd3f5 100644 --- a/src/test/java/com/example/solidconnection/e2e/SignUpTest.java +++ b/src/test/java/com/example/solidconnection/e2e/SignUpTest.java @@ -2,7 +2,8 @@ import com.example.solidconnection.auth.dto.SignUpRequest; import com.example.solidconnection.auth.dto.SignUpResponse; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; +import com.example.solidconnection.auth.service.SignUpTokenProvider; import com.example.solidconnection.custom.response.ErrorResponse; import com.example.solidconnection.entity.Country; import com.example.solidconnection.entity.InterestedCountry; @@ -27,7 +28,6 @@ import java.util.List; -import static com.example.solidconnection.auth.domain.TokenType.KAKAO_OAUTH; import static com.example.solidconnection.auth.domain.TokenType.REFRESH; import static com.example.solidconnection.custom.exception.ErrorCode.JWT_EXCEPTION; import static com.example.solidconnection.custom.exception.ErrorCode.NICKNAME_ALREADY_EXISTED; @@ -56,7 +56,10 @@ class SignUpTest extends BaseEndToEndTest { InterestedCountyRepository interestedCountyRepository; @Autowired - TokenProvider tokenProvider; + AuthTokenProvider authTokenProvider; + + @Autowired + SignUpTokenProvider signUpTokenProvider; @Autowired RedisTemplate redisTemplate; @@ -71,8 +74,7 @@ class SignUpTest extends BaseEndToEndTest { // setup - 카카오 토큰 발급 String email = "email@email.com"; - String generatedKakaoToken = tokenProvider.generateToken(email, KAKAO_OAUTH); - tokenProvider.saveToken(generatedKakaoToken, KAKAO_OAUTH); + String generatedKakaoToken = signUpTokenProvider.generateAndSaveSignUpToken(email); // request - body 생성 및 요청 List interestedRegionNames = List.of("유럽"); @@ -124,8 +126,7 @@ class SignUpTest extends BaseEndToEndTest { // setup - 카카오 토큰 발급 String email = "email@email.com"; - String generatedKakaoToken = tokenProvider.generateToken(email, KAKAO_OAUTH); - tokenProvider.saveToken(generatedKakaoToken, KAKAO_OAUTH); + String generatedKakaoToken = signUpTokenProvider.generateAndSaveSignUpToken(email); // request - body 생성 및 요청 SignUpRequest signUpRequest = new SignUpRequest(generatedKakaoToken, null, null, @@ -150,8 +151,7 @@ class SignUpTest extends BaseEndToEndTest { siteUserRepository.save(alreadyExistUser); // setup - 카카오 토큰 발급 - String generatedKakaoToken = tokenProvider.generateToken(alreadyExistEmail, KAKAO_OAUTH); - tokenProvider.saveToken(generatedKakaoToken, KAKAO_OAUTH); + String generatedKakaoToken = signUpTokenProvider.generateAndSaveSignUpToken(alreadyExistEmail); // request - body 생성 및 요청 SignUpRequest signUpRequest = new SignUpRequest(generatedKakaoToken, null, null, diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java index 7c4445151..01b2b5730 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityDetailTest.java @@ -1,6 +1,6 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.dto.LanguageRequirementResponse; @@ -23,7 +23,7 @@ class UniversityDetailTest extends UniversityDataSetUpEndToEndTest { private SiteUserRepository siteUserRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; private String accessToken; @@ -35,8 +35,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(siteUser); - tokenProvider.generateAndSaveRefreshToken(siteUser); + accessToken = authTokenProvider.generateAccessToken(siteUser); + authTokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java index 707ee3968..3b5733d82 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityLikeTest.java @@ -1,6 +1,6 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.LikedUniversityRepository; import com.example.solidconnection.siteuser.repository.SiteUserRepository; @@ -42,7 +42,7 @@ class UniversityLikeTest extends UniversityDataSetUpEndToEndTest { private LikedUniversityRepository likedUniversityRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; private String accessToken; private SiteUser siteUser; @@ -54,8 +54,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(siteUser); - tokenProvider.generateAndSaveRefreshToken(siteUser); + accessToken = authTokenProvider.generateAccessToken(siteUser); + authTokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java b/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java index bf58c13e4..8e1e8184f 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversityRecommendTest.java @@ -1,6 +1,6 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.entity.InterestedCountry; import com.example.solidconnection.entity.InterestedRegion; import com.example.solidconnection.repositories.InterestedCountyRepository; @@ -37,7 +37,7 @@ class UniversityRecommendTest extends UniversityDataSetUpEndToEndTest { private InterestedCountyRepository interestedCountyRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; @Autowired private GeneralUniversityRecommendService generalUniversityRecommendService; @@ -53,8 +53,8 @@ void setUp() { generalUniversityRecommendService.init(); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(siteUser); - tokenProvider.generateAndSaveRefreshToken(siteUser); + accessToken = authTokenProvider.generateAccessToken(siteUser); + authTokenProvider.generateAndSaveRefreshToken(siteUser); } @Test diff --git a/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java b/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java index a8bcc6f8d..3b508d014 100644 --- a/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java +++ b/src/test/java/com/example/solidconnection/e2e/UniversitySearchTest.java @@ -1,6 +1,6 @@ package com.example.solidconnection.e2e; -import com.example.solidconnection.auth.service.TokenProvider; +import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse; @@ -22,7 +22,7 @@ class UniversitySearchTest extends UniversityDataSetUpEndToEndTest { private SiteUserRepository siteUserRepository; @Autowired - private TokenProvider tokenProvider; + private AuthTokenProvider authTokenProvider; private String accessToken; private SiteUser siteUser; @@ -34,8 +34,8 @@ public void setUpUserAndToken() { siteUserRepository.save(siteUser); // setUp - 엑세스 토큰 생성과 리프레시 토큰 생성 및 저장 - accessToken = tokenProvider.generateAccessToken(siteUser); - tokenProvider.generateAndSaveRefreshToken(siteUser); + accessToken = authTokenProvider.generateAccessToken(siteUser); + authTokenProvider.generateAndSaveRefreshToken(siteUser); } @Test From 9120c7a3d2df2a42e731d6d6e4df817b04e40c5b Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 6 Feb 2025 09:35:40 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20=ED=95=A8=EC=88=98=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 범용적으로 사용되는 지금 상황에 적합하도록 --- .../example/solidconnection/auth/domain/TokenType.java | 4 ++-- .../solidconnection/auth/service/AuthTokenProvider.java | 4 ++-- .../solidconnection/auth/service/SignUpTokenProvider.java | 2 +- .../solidconnection/auth/service/TokenProvider.java | 2 +- .../solidconnection/auth/service/TokenValidator.java | 4 ++-- .../auth/service/AuthTokenProviderTest.java | 8 ++++---- .../auth/service/SignUpTokenProviderTest.java | 4 ++-- .../custom/security/filter/SignOutCheckFilterTest.java | 2 +- .../java/com/example/solidconnection/e2e/SignInTest.java | 6 +++--- .../java/com/example/solidconnection/e2e/SignUpTest.java | 2 +- 10 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/example/solidconnection/auth/domain/TokenType.java b/src/main/java/com/example/solidconnection/auth/domain/TokenType.java index c06a6e6fb..caf1c7a9d 100644 --- a/src/main/java/com/example/solidconnection/auth/domain/TokenType.java +++ b/src/main/java/com/example/solidconnection/auth/domain/TokenType.java @@ -19,7 +19,7 @@ public enum TokenType { this.expireTime = expireTime; } - public String addPrefixToSubject(String subject) { - return prefix + subject; + public String addPrefix(String string) { + return prefix + string; } } diff --git a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java index 1a4122472..9c260d4c9 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java @@ -38,12 +38,12 @@ public String generateAndSaveBlackListToken(String accessToken) { } public Optional findRefreshToken(String subject) { - String refreshTokenKey = TokenType.REFRESH.addPrefixToSubject(subject); + String refreshTokenKey = TokenType.REFRESH.addPrefix(subject); return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); } public Optional findBlackListToken(String subject) { - String refreshTokenKey = TokenType.BLACKLIST.addPrefixToSubject(subject); + String refreshTokenKey = TokenType.BLACKLIST.addPrefix(subject); return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); } diff --git a/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java index 5bacfdd05..f04bf112b 100644 --- a/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/SignUpTokenProvider.java @@ -20,7 +20,7 @@ public String generateAndSaveSignUpToken(String email) { } public Optional findSignUpToken(String email) { - String signUpKey = TokenType.SIGN_UP.addPrefixToSubject(email); + String signUpKey = TokenType.SIGN_UP.addPrefix(email); return Optional.ofNullable(redisTemplate.opsForValue().get(signUpKey)); } } diff --git a/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java index 9f0712893..f5f638ab3 100644 --- a/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/TokenProvider.java @@ -37,7 +37,7 @@ protected final String generateToken(String string, TokenType tokenType) { protected final String saveToken(String token, TokenType tokenType) { String subject = parseSubject(token, jwtProperties.secret()); redisTemplate.opsForValue().set( - tokenType.addPrefixToSubject(subject), + tokenType.addPrefix(subject), token, tokenType.getExpireTime(), TimeUnit.MILLISECONDS diff --git a/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java b/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java index bc579c598..a87a4aa2c 100644 --- a/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java +++ b/src/main/java/com/example/solidconnection/auth/service/TokenValidator.java @@ -63,14 +63,14 @@ private void validateTokenNotExpired(String token, TokenType tokenType) { private void validateRefreshToken(String token) { String email = getClaim(token).getSubject(); - if (redisTemplate.opsForValue().get(REFRESH.addPrefixToSubject(email)) == null) { + if (redisTemplate.opsForValue().get(REFRESH.addPrefix(email)) == null) { throw new CustomException(REFRESH_TOKEN_EXPIRED); } } private void validateKakaoTokenNotUsed(String token) { String email = getClaim(token).getSubject(); - if (!Objects.equals(redisTemplate.opsForValue().get(SIGN_UP.addPrefixToSubject(email)), token)) { + if (!Objects.equals(redisTemplate.opsForValue().get(SIGN_UP.addPrefix(email)), token)) { throw new CustomException(INVALID_SERVICE_PUBLISHED_KAKAO_TOKEN); } } diff --git a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java index db4efa7d1..f5616973f 100644 --- a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java @@ -85,7 +85,7 @@ class 리프레시_토큰을_제공한다 { // then String actualSubject = JwtUtils.parseSubject(refreshToken, jwtProperties.secret()); - String refreshTokenKey = TokenType.REFRESH.addPrefixToSubject(subject); + String refreshTokenKey = TokenType.REFRESH.addPrefix(subject); assertAll( () -> assertThat(actualSubject).isEqualTo(subject), () -> assertThat(redisTemplate.opsForValue().get(refreshTokenKey)).isEqualTo(refreshToken) @@ -96,7 +96,7 @@ class 리프레시_토큰을_제공한다 { void 저장된_리프레시_토큰을_조회한다() { // given String refreshToken = "refreshToken"; - redisTemplate.opsForValue().set(TokenType.REFRESH.addPrefixToSubject(subject), refreshToken); + redisTemplate.opsForValue().set(TokenType.REFRESH.addPrefix(subject), refreshToken); // when Optional optionalRefreshToken = authTokenProvider.findRefreshToken(subject); @@ -126,7 +126,7 @@ class 블랙리스트_토큰을_제공한다 { // then String actualSubject = JwtUtils.parseSubject(blackListToken, jwtProperties.secret()); - String blackListTokenKey = TokenType.BLACKLIST.addPrefixToSubject(accessToken); + String blackListTokenKey = TokenType.BLACKLIST.addPrefix(accessToken); assertAll( () -> assertThat(actualSubject).isEqualTo(accessToken), () -> assertThat(redisTemplate.opsForValue().get(blackListTokenKey)).isEqualTo(blackListToken) @@ -138,7 +138,7 @@ class 블랙리스트_토큰을_제공한다 { // given String accessToken = "accessToken"; String blackListToken = "token"; - redisTemplate.opsForValue().set(TokenType.BLACKLIST.addPrefixToSubject(accessToken), blackListToken); + redisTemplate.opsForValue().set(TokenType.BLACKLIST.addPrefix(accessToken), blackListToken); // when Optional optionalBlackListToken = authTokenProvider.findBlackListToken(accessToken); diff --git a/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java b/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java index 3adbdf9ef..382008d8c 100644 --- a/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/SignUpTokenProviderTest.java @@ -35,7 +35,7 @@ class SignUpTokenProviderTest { // then String actualSubject = JwtUtils.parseSubject(signUpToken, jwtProperties.secret()); - String signUpTokenKey = TokenType.SIGN_UP.addPrefixToSubject(email); + String signUpTokenKey = TokenType.SIGN_UP.addPrefix(email); assertAll( () -> assertThat(actualSubject).isEqualTo(email), () -> assertThat(redisTemplate.opsForValue().get(signUpTokenKey)).isEqualTo(signUpToken) @@ -47,7 +47,7 @@ class SignUpTokenProviderTest { // given String email = "email"; String signUpToken = "token"; - redisTemplate.opsForValue().set(TokenType.SIGN_UP.addPrefixToSubject(email), signUpToken); + redisTemplate.opsForValue().set(TokenType.SIGN_UP.addPrefix(email), signUpToken); // when Optional actualSignUpToken = signUpTokenProvider.findSignUpToken(email); diff --git a/src/test/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilterTest.java b/src/test/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilterTest.java index 7eac22c71..a11d8d28a 100644 --- a/src/test/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilterTest.java +++ b/src/test/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilterTest.java @@ -59,7 +59,7 @@ void setUp() { // given String token = createToken(subject); request = createRequest(token); - String refreshTokenKey = BLACKLIST.addPrefixToSubject(token); + String refreshTokenKey = BLACKLIST.addPrefix(token); redisTemplate.opsForValue().set(refreshTokenKey, "signOut"); // when & then diff --git a/src/test/java/com/example/solidconnection/e2e/SignInTest.java b/src/test/java/com/example/solidconnection/e2e/SignInTest.java index 76933da76..8d3ddc75f 100644 --- a/src/test/java/com/example/solidconnection/e2e/SignInTest.java +++ b/src/test/java/com/example/solidconnection/e2e/SignInTest.java @@ -65,7 +65,7 @@ class SignInTest extends BaseEndToEndTest { () -> assertThat(response.nickname()).isEqualTo(kakaoProfileDto.nickname()), () -> assertThat(response.profileImageUrl()).isEqualTo(kakaoProfileDto.profileImageUrl()), () -> assertThat(response.kakaoOauthToken()).isNotNull()); - assertThat(redisTemplate.opsForValue().get(SIGN_UP.addPrefixToSubject(email))) + assertThat(redisTemplate.opsForValue().get(SIGN_UP.addPrefix(email))) .as("카카오 인증 토큰을 저장한다.") .isEqualTo(response.kakaoOauthToken()); } @@ -95,7 +95,7 @@ class SignInTest extends BaseEndToEndTest { () -> assertThat(response.isRegistered()).isTrue(), () -> assertThat(response.accessToken()).isNotNull(), () -> assertThat(response.refreshToken()).isNotNull()); - assertThat(redisTemplate.opsForValue().get(REFRESH.addPrefixToSubject(siteUser.getId().toString()))) + assertThat(redisTemplate.opsForValue().get(REFRESH.addPrefix(siteUser.getId().toString()))) .as("리프레시 토큰을 저장한다.") .isEqualTo(response.refreshToken()); } @@ -130,7 +130,7 @@ class SignInTest extends BaseEndToEndTest { () -> assertThat(response.accessToken()).isNotNull(), () -> assertThat(response.refreshToken()).isNotNull(), () -> assertThat(updatedSiteUser.getQuitedAt()).isNull()); - assertThat(redisTemplate.opsForValue().get(REFRESH.addPrefixToSubject(siteUser.getId().toString()))) + assertThat(redisTemplate.opsForValue().get(REFRESH.addPrefix(siteUser.getId().toString()))) .as("리프레시 토큰을 저장한다.") .isEqualTo(response.refreshToken()); } diff --git a/src/test/java/com/example/solidconnection/e2e/SignUpTest.java b/src/test/java/com/example/solidconnection/e2e/SignUpTest.java index ce71bd3f5..1bbe150a8 100644 --- a/src/test/java/com/example/solidconnection/e2e/SignUpTest.java +++ b/src/test/java/com/example/solidconnection/e2e/SignUpTest.java @@ -112,7 +112,7 @@ class SignUpTest extends BaseEndToEndTest { () -> assertThat(interestedCountries).containsExactlyInAnyOrderElementsOf(countries) ); - assertThat(redisTemplate.opsForValue().get(REFRESH.addPrefixToSubject(savedSiteUser.getId().toString()))) + assertThat(redisTemplate.opsForValue().get(REFRESH.addPrefix(savedSiteUser.getId().toString()))) .as("리프레시 토큰을 저장한다.") .isEqualTo(response.refreshToken()); } From 7ae4072021b6379a8b9512f669d216a61afbb39a Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 6 Feb 2025 09:41:24 +0900 Subject: [PATCH 4/5] =?UTF-8?q?chore:=20=EB=8B=AC=EC=84=B1=ED=95=9C=20todo?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/solidconnection/auth/service/SignInService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/example/solidconnection/auth/service/SignInService.java b/src/main/java/com/example/solidconnection/auth/service/SignInService.java index e740c7625..8ca39eb62 100644 --- a/src/main/java/com/example/solidconnection/auth/service/SignInService.java +++ b/src/main/java/com/example/solidconnection/auth/service/SignInService.java @@ -65,7 +65,6 @@ private SignInResponse getSignInInfo(SiteUser siteUser) { return new SignInResponse(true, accessToken, refreshToken); } - // todo: SignUpTokenProvider 를 만들어서 거기에만 의존하도록 변경 필요 private FirstAccessResponse getFirstAccessInfo(KakaoUserInfoDto kakaoUserInfoDto) { String kakaoOauthToken = signUpTokenProvider.generateAndSaveSignUpToken(kakaoUserInfoDto.kakaoAccountDto().email()); return FirstAccessResponse.of(kakaoUserInfoDto, kakaoOauthToken); From 858aaba3225abdc87d3cf734a82e0b166de6715e Mon Sep 17 00:00:00 2001 From: nayonsoso Date: Thu, 6 Feb 2025 09:41:41 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=ED=95=A0=EB=8B=B9=20=EC=A0=9C=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solidconnection/auth/service/AuthTokenProvider.java | 8 ++++---- .../custom/security/filter/SignOutCheckFilter.java | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java index 9c260d4c9..da040a8d5 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java @@ -33,8 +33,8 @@ public String generateAndSaveRefreshToken(SiteUser siteUser) { } public String generateAndSaveBlackListToken(String accessToken) { - String refreshToken = generateToken(accessToken, TokenType.BLACKLIST); - return saveToken(refreshToken, TokenType.BLACKLIST); + String blackListToken = generateToken(accessToken, TokenType.BLACKLIST); + return saveToken(blackListToken, TokenType.BLACKLIST); } public Optional findRefreshToken(String subject) { @@ -43,8 +43,8 @@ public Optional findRefreshToken(String subject) { } public Optional findBlackListToken(String subject) { - String refreshTokenKey = TokenType.BLACKLIST.addPrefix(subject); - return Optional.ofNullable(redisTemplate.opsForValue().get(refreshTokenKey)); + String blackListTokenKey = TokenType.BLACKLIST.addPrefix(subject); + return Optional.ofNullable(redisTemplate.opsForValue().get(blackListTokenKey)); } public String getEmail(String token) { diff --git a/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java b/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java index b307ecca2..2cef8d1ac 100644 --- a/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java +++ b/src/main/java/com/example/solidconnection/custom/security/filter/SignOutCheckFilter.java @@ -12,7 +12,6 @@ import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; -import java.util.Optional; import static com.example.solidconnection.custom.exception.ErrorCode.USER_ALREADY_SIGN_OUT; import static com.example.solidconnection.util.JwtUtils.parseTokenFromRequest; @@ -35,7 +34,6 @@ protected void doFilterInternal(@NonNull HttpServletRequest request, } private boolean hasSignedOut(String accessToken) { - Optional blackListToken = authTokenProvider.findBlackListToken(accessToken); - return blackListToken.isPresent(); + return authTokenProvider.findBlackListToken(accessToken).isPresent(); } }