Skip to content

Commit

Permalink
feat : 리프레시 토큰 발급 기능 구현 #18
Browse files Browse the repository at this point in the history
  • Loading branch information
Jin409 committed Jun 1, 2023
1 parent eef3177 commit 7a021b6
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,47 +5,66 @@
import io.jsonwebtoken.Header;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;
import java.util.Date;
import javax.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import sopt.org.FourthSeminar.exception.Error;
import sopt.org.FourthSeminar.exception.model.UnauthorizedException;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.time.Duration;
import java.util.Base64;
import java.util.Date;

@Service
@RequiredArgsConstructor
public class JwtService {
@Value("${jwt.secret}")
private String jwtSecret;

private final RedisTemplate<String, String> redisTemplate;

@PostConstruct
protected void init() {
jwtSecret = Base64.getEncoder()
.encodeToString(jwtSecret.getBytes(StandardCharsets.UTF_8));
}

// JWT 토큰 발급
public String issuedToken(String userId) {
private String issuedToken(final String userId, final Long duration, final String type) {
final Date now = new Date();

// 클레임 생성
final Claims claims = Jwts.claims()
.setSubject("access_token")
.setSubject(type)
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + 120 * 60 * 1000L));

//private claim 등록
claims.put("userId", userId);
.setExpiration(new Date(now.getTime() + duration));

return Jwts.builder()
.setHeaderParam(Header.TYPE, Header.JWT_TYPE)
.setClaims(claims)
.signWith(getSigningKey())
.compact();

}

// JWT 액세스 토큰 발급
public String issuedAccessToken(String userId) {
final long duration = 120 * 60 * 1000L;
return issuedToken(userId, duration, "access_token");
}

// JWT 리프레시 토큰 발급
public String issuedRefreshToken(String userId) {
final Long duration = 120 * 60 * 30 * 1000L;
String refreshToken = issuedToken(userId, duration, "refresh_token");
redisTemplate.opsForValue().set(String.valueOf(userId), refreshToken, Duration.ofMillis(duration));
return refreshToken;
}


private Key getSigningKey() {
final byte[] keyBytes = jwtSecret.getBytes(StandardCharsets.UTF_8);
return Keys.hmacShaKeyFor(keyBytes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ public ApiResponse<UserResponseDto> create(@RequestBody @Valid final UserRequest
@Operation(summary = "유저 로그인", description = "로그인합니다.")
public ApiResponse<UserLoginResponseDto> login(@RequestBody @Valid final UserLoginRequestDto request) {
final Long userId = userService.login(request);
final String token = jwtService.issuedToken(String.valueOf(userId));
return ApiResponse.success(Success.LOGIN_SUCCESS, UserLoginResponseDto.of(userId, token));
final String accessToken = jwtService.issuedAccessToken(String.valueOf(userId));
final String refreshToken = jwtService.issuedRefreshToken(String.valueOf(userId));
return ApiResponse.success(Success.LOGIN_SUCCESS, UserLoginResponseDto.of(userId, accessToken, refreshToken));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ public class UserLoginResponseDto {
private Long userId;
private String accessToken;

public static UserLoginResponseDto of(Long userId, String accessToken) {
return new UserLoginResponseDto(userId, accessToken);
private String refreshToken;

public static UserLoginResponseDto of(Long userId, String accessToken, String refreshToken) {
return new UserLoginResponseDto(userId, accessToken, refreshToken);
}
}

0 comments on commit 7a021b6

Please sign in to comment.