Spring JWT 삽질

GGOMG·2022년 10월 24일
0

개인프로젝트

목록 보기
1/1

개요

개인 Springboot 프로젝트에 JWT를 적용하려고 했는데,
예제코드에서는 0.9.1 버전을 사용했지만,
나는 최신 버전을 사용하고 싶었다.

구글링을 해보아도 해결 방법 찾기가 어려웠기에
그 해결과정을 기록한다.

1. JWT Dependencies

요약 : 2022-10-24 기준 아래 세줄을 사용하자.

implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-api0:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'

처음에는

implementation 'io.jsonwebtoken:jjwt'

이거 한 줄만 추가했다.
근데 참고한 예제 코드에서

Jwts.builer()
.~

를 사용하는데 인텔리제이에서 import를 못잡길래 문제가 있음을 인식했다
https://jwt.io/libraries 에서 찾아본 결과

maven: io.jsonwebtoken / jjwt-root / 0.11.1
를
implementation 'io.jsonwebtoken:jjwt-root:0.11.1'
로 변경해도 안되더라

jjwt은 javadoc에서도 버전 0.9.1 까지만 문서가 존재한다.
버전 0.10부터 바뀐 듯 하다.


2. JWT builer.signwith()

Jwts.builder()
    .signWith(SignatureAlgorithm.HS512,SECRET_KEY)
    .~

를 사용하려하면
signWith에 취소선이 그어지며 설명이 뜬다.

자세한걸 보기위해 javadoc에 들어가보면
https://javadoc.io/doc/io.jsonwebtoken/jjwt-api/latest/index.html

signWith 메서드에 @Deprecated가 붙어있다.
위 설명과 함께 요약해보자면

많은 사용자들이 (내가 참조한 예제코드 포함)

signWith(SignatureAlgorithm.HS512,"my_only_super_Secret_Key!!_example")

와 같은 방법으로 사용이 가능한 것에 대해 혼란스러워한다. (나도 그랬다. 이게 비밀키?)

0.10.0부터: 대신 signWith(Key) 또는 signWith(Key, SignatureAlgorithm) 을 사용하십시오. 이 메서드는 1.0 릴리스에서 제거됩니다.

그리고 함께 이런 방식의 코드를 제안한다.

 byte[] keyBytes = Decoders.BASE64.decode(base64EncodedSecretKey);
 Key key = Keys.hmacShaKeyFor(keyBytes);
 jwtBuilder.signWith(key); //or signWith(Key, SignatureAlgorithm)

결론

최종 코드

    private Key key = Keys.secretKeyFor(SignatureAlgorithm.HS512);

    public String create(Long memberId) {
        return Jwts.builder()
                .signWith(key)
                .setSubject(String.valueOf(memberId))
                .setIssuer("GGOMG")
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 3600000))
                .compact();
    }

0개의 댓글