Skip to content

Commit e58dce3

Browse files
committed
refactor : 리프레시 토큰 구조 개선
- user id만 사용(email제거) - 토큰 갱신할떄 상태관리를 위해 유저 정보 제공 - 테스트하지않고 애플리케이션 빌드(cicd)
1 parent db8a1d0 commit e58dce3

File tree

6 files changed

+61
-28
lines changed

6 files changed

+61
-28
lines changed

Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ COPY .env .
1717
COPY src src
1818

1919
# 애플리케이션 빌드
20-
RUN gradle build --no-daemon
20+
#RUN gradle build --no-daemon
21+
RUN gradle build -x test --no-daemon
2122

2223
# 두 번째 스테이지: 실행 스테이지
2324
FROM container-registry.oracle.com/graalvm/jdk:21

src/main/java/com/back/domain/user/controller/UserAuthController.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.user.controller;
22

3+
import com.back.domain.user.dto.RefreshTokenResDto;
34
import com.back.domain.user.service.UserAuthService;
45
import com.back.global.rsData.RsData;
56
import io.swagger.v3.oas.annotations.Operation;
@@ -17,7 +18,7 @@
1718
@Tag(name = "UserAuth", description = "사용자 인증 API")
1819
@Slf4j
1920
@RestController
20-
@RequestMapping("/api/user/auth")
21+
@RequestMapping("/user/auth")
2122
@RequiredArgsConstructor
2223
public class UserAuthController {
2324

@@ -32,11 +33,11 @@ public class UserAuthController {
3233
@ApiResponse(responseCode = "401", description = "토큰이 유효하지 않거나 만료됨")
3334
})
3435
@PostMapping("/refresh")
35-
public RsData<Void> refreshToken(HttpServletRequest request, HttpServletResponse response) {
36-
boolean success = userAuthService.refreshTokens(request, response);
36+
public RsData<RefreshTokenResDto> refreshToken(HttpServletRequest request, HttpServletResponse response) {
37+
RefreshTokenResDto refreshToken = userAuthService.refreshTokens(request, response);
3738

38-
if (success) {
39-
return RsData.of(200, "토큰이 성공적으로 갱신되었습니다.");
39+
if (refreshToken != null) {
40+
return RsData.of(200, "토큰이 갱신 성공.", refreshToken);
4041
} else {
4142
return RsData.of(401, "토큰 갱신에 실패했습니다. 다시 로그인해주세요.");
4243
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.back.domain.user.dto;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Getter
7+
@Builder
8+
public class RefreshTokenResDto {
9+
private final String accessToken;
10+
private final UserInfoDto user;
11+
12+
@Getter
13+
@Builder
14+
public static class UserInfoDto {
15+
private final String id;
16+
private final String nickname;
17+
private final Boolean isFirstLogin;
18+
private final Double abvDgree;
19+
20+
}
21+
}

src/main/java/com/back/domain/user/service/UserAuthService.java

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.domain.user.service;
22

3+
import com.back.domain.user.dto.RefreshTokenResDto;
34
import com.back.domain.user.entity.User;
45
import com.back.domain.user.repository.UserRepository;
56
import com.back.global.exception.ServiceException;
@@ -134,46 +135,58 @@ public String generateNickname(String baseNickname) {
134135

135136
public void issueTokens(HttpServletResponse response, Long userId, String email, String nickname) {
136137
String accessToken = jwtUtil.generateAccessToken(userId, email, nickname);
137-
String refreshToken = refreshTokenService.generateRefreshToken(userId, email);
138+
String refreshToken = refreshTokenService.generateRefreshToken(userId);
138139

139140
jwtUtil.addAccessTokenToCookie(response, accessToken);
140141
jwtUtil.addRefreshTokenToCookie(response, refreshToken);
141142
}
142143

143-
public boolean refreshTokens(HttpServletRequest request, HttpServletResponse response) {
144+
public RefreshTokenResDto refreshTokens(HttpServletRequest request, HttpServletResponse response) {
144145
try {
145146
String oldRefreshToken = jwtUtil.getRefreshTokenFromCookie(request);
146147

147148
if (oldRefreshToken == null || !refreshTokenService.validateToken(oldRefreshToken)) {
148-
return false;
149+
return null;
149150
}
150151

151152
Optional<RefreshToken> tokenData = refreshTokenRepository.findByToken(oldRefreshToken);
152153
if (tokenData.isEmpty()) {
153-
return false;
154+
return null;
154155
}
155156

156157
RefreshToken refreshTokenEntity = tokenData.get();
157158
Long userId = refreshTokenEntity.getUserId();
158-
String email = refreshTokenEntity.getEmail();
159159

160-
// DB에서 현재 nickname 조회
161-
Optional<User> user = userRepository.findById(userId);
162-
if (user.isEmpty()) {
163-
return false;
160+
// DB에서 사용자 정보 조회
161+
Optional<User> userOpt = userRepository.findById(userId);
162+
if (userOpt.isEmpty()) {
163+
return null;
164164
}
165-
String nickname = user.get().getNickname();
165+
166+
User user = userOpt.get();
167+
String nickname = user.getNickname();
168+
String email = user.getEmail();
166169

167170
String newRefreshToken = refreshTokenService.rotateToken(oldRefreshToken);
168171
String newAccessToken = jwtUtil.generateAccessToken(userId, email, nickname);
169172

170173
jwtUtil.addAccessTokenToCookie(response, newAccessToken);
171174
jwtUtil.addRefreshTokenToCookie(response, newRefreshToken);
172175

173-
return true;
176+
return RefreshTokenResDto.builder()
177+
.accessToken(newAccessToken)
178+
.user(
179+
RefreshTokenResDto.UserInfoDto.builder()
180+
.id(user.getId().toString())
181+
.nickname(nickname)
182+
.isFirstLogin(user.isFirstLogin())
183+
.abvDgree(user.getAbvDegree())
184+
.build()
185+
)
186+
.build();
174187
} catch (Exception e) {
175188
log.error("토큰 갱신 중 오류 발생: {}", e.getMessage());
176-
return false;
189+
return null;
177190
}
178191
}
179192

src/main/java/com/back/global/jwt/refreshToken/entity/RefreshToken.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,18 @@ public class RefreshToken {
2020
@Column(nullable = false)
2121
private Long userId;
2222

23-
@Column(nullable = false)
24-
private String email;
25-
2623
@Column(nullable = false)
2724
private LocalDateTime createdAt;
2825

2926
@Column(nullable = false)
3027
private LocalDateTime expiresAt;
3128

32-
public static RefreshToken create(String token, Long userId, String email, long ttlSeconds) {
29+
30+
public static RefreshToken create(String token, Long userId, long ttlSeconds) {
3331
LocalDateTime now = LocalDateTime.now();
3432
return RefreshToken.builder()
3533
.token(token)
3634
.userId(userId)
37-
.email(email)
3835
.createdAt(now)
3936
.expiresAt(now.plusSeconds(ttlSeconds))
4037
.build();

src/main/java/com/back/global/jwt/refreshToken/service/RefreshTokenService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
import com.back.global.jwt.refreshToken.repository.RefreshTokenRepository;
66
import lombok.RequiredArgsConstructor;
77
import org.springframework.beans.factory.annotation.Value;
8+
import org.springframework.scheduling.annotation.Scheduled;
89
import org.springframework.stereotype.Service;
10+
import org.springframework.transaction.annotation.Transactional;
911

1012
import java.security.SecureRandom;
1113
import java.time.LocalDateTime;
1214
import java.util.Base64;
1315
import java.util.Optional;
14-
import org.springframework.scheduling.annotation.Scheduled;
15-
import org.springframework.transaction.annotation.Transactional;
1616

1717
@Service
1818
@RequiredArgsConstructor
@@ -26,12 +26,12 @@ public class RefreshTokenService {
2626

2727
// 기존 리프레시 토큰 삭제하고 생성
2828
@Transactional
29-
public String generateRefreshToken(Long userId, String email) {
29+
public String generateRefreshToken(Long userId) {
3030
// 기존 토큰 삭제
3131
refreshTokenRepository.deleteByUserId(userId);
3232

3333
String token = generateSecureToken();
34-
RefreshToken refreshToken = RefreshToken.create(token, userId, email, refreshTokenExpiration);
34+
RefreshToken refreshToken = RefreshToken.create(token, userId, refreshTokenExpiration);
3535
refreshTokenRepository.save(refreshToken);
3636

3737
return token;
@@ -65,7 +65,7 @@ public String rotateToken(String oldToken) {
6565
RefreshToken tokenData = oldRefreshToken.get();
6666
revokeToken(oldToken);
6767

68-
return generateRefreshToken(tokenData.getUserId(), tokenData.getEmail());
68+
return generateRefreshToken(tokenData.getUserId());
6969
}
7070

7171
//삭제

0 commit comments

Comments
 (0)