From c748dd0189cb3c2b87019b87f762ac785bcf5b57 Mon Sep 17 00:00:00 2001 From: Hexeong <123macanic@naver.com> Date: Wed, 20 May 2026 15:31:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=EC=95=A1=EC=84=B8=EC=8A=A4=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20JWT=20=ED=81=B4=EB=A0=88=EC=9E=84=EC=97=90?= =?UTF-8?q?=20homeUniversityId=EB=A5=BC=20=EC=B6=94=EA=B0=80=20-=20generat?= =?UTF-8?q?eAccessToken=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=20siteUser?= =?UTF-8?q?=EA=B0=80=20homeUniversityId=EA=B0=80=20null=EC=9D=B4=20?= =?UTF-8?q?=EC=95=84=EB=8B=88=EB=9D=BC=EB=A9=B4=20claim=EC=97=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20parseHomeUniversityId=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/AuthTokenProvider.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) 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 ef188833b..0236752b4 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java @@ -10,6 +10,8 @@ import com.example.solidconnection.siteuser.domain.Role; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; + +import java.util.HashMap; import java.util.Map; import java.util.Objects; import lombok.RequiredArgsConstructor; @@ -20,6 +22,7 @@ public class AuthTokenProvider { private static final String ROLE_CLAIM_KEY = "role"; + private static final String HOME_UNIVERSITY_CLAIM_KEY = "home_university"; private final TokenProvider tokenProvider; private final TokenStorage tokenStorage; @@ -29,9 +32,14 @@ public class AuthTokenProvider { public AccessToken generateAccessToken(SiteUser siteUser) { Subject subject = toSubject(siteUser); Role role = siteUser.getRole(); + Map claims = new HashMap<>(Map.of(ROLE_CLAIM_KEY, role.name())); + if (siteUser.getHomeUniversityId() != null) { + claims.put(HOME_UNIVERSITY_CLAIM_KEY, String.valueOf(siteUser.getHomeUniversityId())); + } + String token = tokenProvider.generateToken( subject, - Map.of(ROLE_CLAIM_KEY, role.name()), + claims, tokenProperties.access().expireTime() ); return new AccessToken(token); @@ -71,6 +79,11 @@ public SiteUser parseSiteUser(String token) { .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); } + public Long parseHomeUniversityId(String token) { + String value = tokenProvider.parseClaims(token, HOME_UNIVERSITY_CLAIM_KEY, String.class); + return value != null ? Long.parseLong(value) : null; + } + public Subject toSubject(SiteUser siteUser) { return new Subject(siteUser.getId().toString()); } From 899627bae52ce7c34bcc795b8e0cfe02e932442b Mon Sep 17 00:00:00 2001 From: Hexeong <123macanic@naver.com> Date: Wed, 20 May 2026 15:32:22 +0900 Subject: [PATCH 2/3] =?UTF-8?q?test:=20=EC=95=A1=EC=84=B8=EC=8A=A4=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20JWT=20=ED=81=B4=EB=A0=88=EC=9E=84=EC=97=90?= =?UTF-8?q?=20homeUniversityId=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=9C=20?= =?UTF-8?q?=EA=B2=83=EC=97=90=20=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80=20-=20SiteUserFixture=EC=97=90?= =?UTF-8?q?=20=EA=B5=AD=EB=82=B4=5F=EB=8C=80=ED=95=99=5F=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=5F=EC=86=8C=EC=A7=80=5F=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20-=20AuthTokenProvider?= =?UTF-8?q?Test=EC=97=90=20homeUniversityId=20=EC=86=8C=EC=A7=80=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=EC=97=90=20=EB=94=B0=EB=A5=B8=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 --- .../auth/service/AuthTokenProviderTest.java | 32 +++++++++++++++++++ .../siteuser/fixture/SiteUserFixture.java | 13 ++++++++ 2 files changed, 45 insertions(+) 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 7a6f64428..6b2d36a11 100644 --- a/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/AuthTokenProviderTest.java @@ -10,6 +10,7 @@ import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.university.fixture.HomeUniversityFixture; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -33,12 +34,19 @@ class AuthTokenProviderTest { @Autowired private SiteUserFixture siteUserFixture; + @Autowired + private HomeUniversityFixture homeUniversityFixture; + private SiteUser siteUser; + private SiteUser siteUserWithHomeUniversity; + private Long homeUniversityId; private Subject expectedSubject; @BeforeEach void setUp() { + homeUniversityId = homeUniversityFixture.인하대학교().getId(); siteUser = siteUserFixture.사용자(); + siteUserWithHomeUniversity = siteUserFixture.국내_대학_정보_소지_사용자(homeUniversityId); expectedSubject = new Subject(siteUser.getId().toString()); } @@ -70,6 +78,30 @@ void setUp() { assertThat(actualSitUser.getId()).isEqualTo(siteUser.getId()); } + @Nested + class 액세스_토큰_homeUniversityId_클레임 { + + @Test + void homeUniversityId가_있는_사용자는_액세스_토큰_클레임에_포함된다() { + // when + String token = authTokenProvider.generateAccessToken(siteUserWithHomeUniversity).token(); + + // then + Long actual = authTokenProvider.parseHomeUniversityId(token); + assertThat(actual).isEqualTo(homeUniversityId); + } + + @Test + void homeUniversityId가_없는_사용자는_액세스_토큰_클레임에서_생략된다() { + // when + String token = authTokenProvider.generateAccessToken(siteUser).token(); + + // then + Long actual = authTokenProvider.parseHomeUniversityId(token); + assertThat(actual).isNull(); + } + } + @Nested class 리프레시_토큰을_제공한다 { diff --git a/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java b/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java index 05262b6a2..1753d0d5d 100644 --- a/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java +++ b/src/test/java/com/example/solidconnection/siteuser/fixture/SiteUserFixture.java @@ -61,6 +61,19 @@ public class SiteUserFixture { .create(); } + public SiteUser 국내_대학_정보_소지_사용자(Long homeUniversityId) { + return siteUserFixtureBuilder.siteUser() + .email("university@example.com") + .authType(AuthType.EMAIL) + .nickname("국내대학사용자") + .homeUniversityId(homeUniversityId) + .profileImageUrl("profileImageUrl") + .role(Role.MENTEE) + .password("password123") + .userStatus(UserStatus.ACTIVE) + .create(); + } + public SiteUser 멘토(int index, String nickname) { return siteUserFixtureBuilder.siteUser() .email("mentor" + index + "@example.com") From 88d2b673ea8f9d31c9809e9ed1e0d95362bc4665 Mon Sep 17 00:00:00 2001 From: Hexeong <123macanic@naver.com> Date: Wed, 20 May 2026 18:39:37 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/solidconnection/auth/service/AuthTokenProvider.java | 1 - 1 file changed, 1 deletion(-) 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 0236752b4..0f5e46c23 100644 --- a/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java +++ b/src/main/java/com/example/solidconnection/auth/service/AuthTokenProvider.java @@ -10,7 +10,6 @@ import com.example.solidconnection.siteuser.domain.Role; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; - import java.util.HashMap; import java.util.Map; import java.util.Objects;