Skip to content

Commit cb9a203

Browse files
authored
[refact] 리프레시 토큰 발급 로직 수정 (#186)
* [refact] 리프레시토큰 발급 로직 수정 #185 * [refact] 상수 추가
1 parent 758d399 commit cb9a203

4 files changed

Lines changed: 21 additions & 15 deletions

File tree

src/main/java/ceos/backend/domain/admin/AdminController.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import ceos.backend.global.config.user.AdminDetails;
88
import io.swagger.v3.oas.annotations.Operation;
99
import io.swagger.v3.oas.annotations.tags.Tag;
10+
import jakarta.servlet.http.HttpServletRequest;
1011
import jakarta.validation.Valid;
1112
import lombok.RequiredArgsConstructor;
1213
import lombok.extern.slf4j.Slf4j;
@@ -21,6 +22,8 @@
2122
public class AdminController {
2223

2324
private final AdminService adminService;
25+
private static final String MOBILE = "mobile";
26+
private static final String WEB = "web";
2427

2528
@Operation(summary = "닉네임 확인")
2629
@PostMapping("/username")
@@ -38,9 +41,10 @@ public void signUp(@RequestBody @Valid SignUpRequest signUpRequest) {
3841

3942
@Operation(summary = "로그인")
4043
@PostMapping("/signin")
41-
public TokenResponse signIn(@RequestBody @Valid SignInRequest signInRequest) {
44+
public TokenResponse signIn(HttpServletRequest request, @RequestBody @Valid SignInRequest signInRequest) {
4245
log.info("로그인");
43-
return adminService.signIn(signInRequest);
46+
String device = request.getHeader("User-Agent").contains("mobile") ? MOBILE : WEB;
47+
return adminService.signIn(device, signInRequest);
4448
}
4549

4650
@Operation(summary = "아이디 찾기")
@@ -68,9 +72,10 @@ public void resetPwd(
6872

6973
@Operation(summary = "로그아웃")
7074
@PostMapping("/logout")
71-
public void logout(@AuthenticationPrincipal AdminDetails adminUser) {
75+
public void logout(HttpServletRequest request, @AuthenticationPrincipal AdminDetails adminUser) {
7276
log.info("로그아웃");
73-
adminService.logout(adminUser);
77+
String device = request.getHeader("User-Agent").contains("mobile") ? MOBILE : WEB;
78+
adminService.logout(device, adminUser);
7479
}
7580

7681
@Operation(summary = "토큰 재발급")

src/main/java/ceos/backend/domain/admin/service/AdminService.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,18 @@ public void signUp(SignUpRequest signUpRequest) {
5151
}
5252

5353
@Transactional
54-
public TokenResponse signIn(SignInRequest signInRequest) {
54+
public TokenResponse signIn(String device, SignInRequest signInRequest) {
5555

5656
final Admin admin = adminHelper.findForSignIn(signInRequest);
5757
final Authentication authentication = adminHelper.adminAuthorizationInput(admin);
5858

5959
adminHelper.checkRole(admin);
6060

61+
String redisKey = admin.getId().toString() + ":" + device;
62+
6163
// 토큰 발급
6264
final String accessToken = tokenProvider.createAccessToken(admin.getId(), authentication);
63-
final String refreshToken = tokenProvider.createRefreshToken(admin.getId(), authentication);
65+
final String refreshToken = tokenProvider.createRefreshToken(admin.getId(), authentication, redisKey);
6466

6567
return adminMapper.toTokenResponse(accessToken, refreshToken);
6668
}
@@ -97,11 +99,13 @@ public void resetPwd(ResetPwdRequest resetPwdRequest, AdminDetails adminUser) {
9799
}
98100

99101
@Transactional
100-
public void logout(AdminDetails adminUser) {
102+
public void logout(String device, AdminDetails adminUser) {
101103
final Admin admin = adminUser.getAdmin();
102104

105+
String redisKey = admin.getId().toString() + ":" + device;
106+
103107
// 레디스 삭제
104-
tokenProvider.deleteRefreshToken(admin.getId());
108+
tokenProvider.deleteRefreshToken(redisKey);
105109
}
106110

107111
@Transactional

src/main/java/ceos/backend/global/config/RedisConfig.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ public RedisConnectionFactory redisConnectionFactory() {
2525

2626
@Bean
2727
public RedisTemplate<String, String> redisTemplate() {
28-
// redisTemplate를 받아와서 set, get, delete를 사용
2928
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
30-
// setKeySerializer, setValueSerializer 설정
31-
// redis-cli을 통해 직접 데이터를 조회 시 알아볼 수 없는 형태로 출력되는 것을 방지
3229
redisTemplate.setKeySerializer(new StringRedisSerializer());
3330
redisTemplate.setValueSerializer(new StringRedisSerializer());
3431
redisTemplate.setConnectionFactory(redisConnectionFactory());

src/main/java/ceos/backend/global/config/jwt/TokenProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public String createAccessToken(Long id, Authentication authentication) {
8282
.compact();
8383
}
8484

85-
public String createRefreshToken(Long id, Authentication authentication) {
85+
public String createRefreshToken(Long id, Authentication authentication, String redisKey) {
8686
String authorities =
8787
authentication.getAuthorities().stream()
8888
.map(GrantedAuthority::getAuthority)
@@ -107,13 +107,13 @@ public String createRefreshToken(Long id, Authentication authentication) {
107107

108108
redisTemplate
109109
.opsForValue()
110-
.set(id.toString(), refreshToken, refreshExpirationTime, TimeUnit.SECONDS);
110+
.set(redisKey, refreshToken, refreshExpirationTime, TimeUnit.SECONDS);
111111

112112
return refreshToken;
113113
}
114114

115-
public void deleteRefreshToken(Long id) {
116-
redisTemplate.delete(id.toString());
115+
public void deleteRefreshToken(String redisKey) {
116+
redisTemplate.delete(redisKey);
117117
}
118118

119119
public String getTokenUserId(String token) {

0 commit comments

Comments
 (0)