개발환경
build.gradle
아래 JwtToken 라이브러리를 받아준다.
1
2
3
| implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
|
코드
JwtController
JWT Token을 발급해줄 API를 만들어준다.
1
2
3
4
5
6
7
8
9
10
11
12
| @RestController
@RequiredArgsConstructor
public class JwtController {
private final AuthTokensGenerator authTokensGenerator;
/*
* 토큰 발급 API
* */
@PostMapping("/auth/token")
public AuthTokens getToken(String Id) {
return authTokensGenerator.generate(Id);
}
}
|
AuthTokenGenerator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| @Component
@RequiredArgsConstructor
public class AuthTokensGenerator {
private static final String BEARER_TYPE = "Bearer";
private static final long ACCESS_TOKEN_EXPIRE_TIME = 1000 * 60; // 1분 -> 테스트를 위해 짧게 설정
private static final long REFRESH_TOKEN_EXPIRE_TIME = 1000 * 60 * 60; //1시간 -> 테스트를 위해 짧게 설정
private final JwtTokenProvider jwtTokenProvider;
public AuthTokens generate(String Id) {
long now = (new Date()).getTime();
Date accessTokenExpiredAt = new Date(now + ACCESS_TOKEN_EXPIRE_TIME); //AccessToken 유효기간 지정
Date refreshTokenExpiredAt = new Date(now + REFRESH_TOKEN_EXPIRE_TIME); //RefreshToken 유효기간 지정
String subject = Id;
String accessToken = jwtTokenProvider.generate(subject, accessTokenExpiredAt); //AccessToken 생성
String refreshToken = jwtTokenProvider.generate(subject, refreshTokenExpiredAt); //RefreshToken 생성
return AuthTokens.of(accessToken, refreshToken, BEARER_TYPE, ACCESS_TOKEN_EXPIRE_TIME / 1000L);
}
}
|
JwtTokenProvider
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /*
* JWTToken의 생성, 유효여부, 복호화 관련 클래스
* */
@Component
public class JwtTokenProvider {
private final Key key;
//키 생성하여 의존성 주입
public JwtTokenProvider(@Value("${jwt.secret-key}") String secretKey) {
byte[] keyBytes = Decoders.BASE64.decode(secretKey); //키 생성
this.key = Keys.hmacShaKeyFor(keyBytes);
}
// 토큰 생성
public String generate(String subject, Date expiredAt) {
return Jwts.builder()
.setSubject(subject)
.setExpiration(expiredAt)
.signWith(key, SignatureAlgorithm.HS512) //사용 할 알고리즘 지정
.compact();
}
}
|
application.yml
리눅스 터미널에서 openssl rand -hex 64
명령어를 입력하면 랜덤한 key를 생성할 수 있다.
1
2
| jwt:
secret-key: 생성한 키
|