둘 다 JWT(JSON Web Token)을 다루는 라이브러리이지만, jjwt는 Java에서 JWT를 쉽게 다룰 수 있도록 만든 라이브러리.
jwt(JSON Web Token)는 데이터의 무결성을 검증할 수 있는 토큰 기반 인증 방식.
즉, JWT는 개념이라고 생각하면 되고, 특정 언어에 종속되지 않은 토큰 형식.
JSON을 기반으로 사용자의 인증 정보를 안전하게 주고받을 수 있음.
Header, Payload, Signature로 구성됨.
보통 HMAC, RSA, ECDSA 등의 알고리즘을 사용하여 서명(Signature)을 포함함.
다양한 프로그래밍 언어에서 JWT를 지원하는 라이브러리가 존재함.
jjwt(Java JWT)
는 Java에서 JWT를 쉽게 생성하고, 검증할 수 있도록 도와주는 라이브러리입.기능 | 메서드 |
---|---|
JWT 생성 | Jwts.builder() |
JWT 서명(Signature) 적용 | signWith() |
JWT 파싱(디코딩) | Jwts.parserBuilder() |
JWT 검증(유효성 체크) | parseClaimsJws() |
SecretKey secretKey = Keys.hmacShaKeyFor(secret.getBytes());
// payload는 토큰의 클레임 = payload 임
Map<String, Object> payload = Map.of(
"name", "Paul",
"age", 23);
// 토큰을 언제 만들었는지
Date issuedAt = new Date();
// 유효기간 날짜에서 시간을 빼고 expireSeconds 에 x 1000해서 ms로 만들어서 더한 값이라고 보면 됨
Date expiration = new Date(issuedAt.getTime() + 1000L * expireSeconds);
String jwtStr = Jwts.builder() // JWT 빌더 객체를 생성
.claims(payload) // 사용자 정보를 설정
.issuedAt(issuedAt) // 발급 시간을 설정
.expiration(expiration) // 만료 시간을 설정
.signWith(secretKey) // 사용자 서명을 적용
.compact(); // 최종적으로 JWT를 Base64Url 문자열로 반환하겠다
assertThat(jwtStr).isNotBlank();
// 키가 유효한지 테스트
Map<String, Object> parsedPayload = (Map<String, Object>) Jwts
.parser() // JWT를 해석하는 객체를 생성
.verifyWith(secretKey) // .parser의 체인 메서드로, JWT를 sercretKey를 활용해 일치하는지 검증)
.build() // 그 기능을 할 parser 객체를 완성 (만든다)
.parse(jwtStr) // 사용자가 입력한 JWT를 해석하여 payload를 추출
.getPayload(); // JWT를 반환
// 키로 부터 payload 를 파싱한 결과가 원래 payload 와 같은지 테스트
assertThat(parsedPayload).containsAllEntriesOf(payload);
Payload
는 JWT에 실질적으로 저장되어 있는 사용자의 정보.Claims
는 Payload를 감싸고 잇는 객체 (Key-value)의 형태parser()
은 JWT를 분석하기 위한 단순 준비에 단계에 속함. 즉, 아직 JWT를 분석하기 이전이라는 의미.
parse()
는 이전 단계에서 parser().verifyWith(secretKey)를 통해 JWT 서명(signature)이 유효한지를 검증하고, 검증이 완료되면 실제로 JWT를 해석.