Home JWT Token 발급 구현
Post
Cancel

JWT Token 발급 구현


개발환경

  • Spring boot 3.1.3
  • Java 17

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: 생성한 키
This post is licensed under CC BY 4.0 by the author.
Contents