jwt는
header, claims, signature 영역으로 이루어진다.
그러나 jwtbuilder의 멤버변수는 다음과 같다.
header/claims/signature의 3개의 변수는 아니다.
public class DefaultJwtBuilder implements JwtBuilder {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private Header header;
private Claims claims;
private String payload;
private SignatureAlgorithm algorithm;
private Key key;
private byte[] keyBytes;
private CompressionCodec compressionCodec;
jwtbuilder 사용예제를 보면 다음과 같다.
String jws = Jwts.builder() .setIssuer("Stormpath") .setSubject("msilverman") .claim("name", "Micah Silverman") .claim("scope", "admins") // Fri Jun 24 2016 15:33:42 GMT-0400 (EDT) .setIssuedAt(Date.from(Instant.ofEpochSecond(1466796822L))) // Sat Jun 24 2116 15:33:42 GMT-0400 (EDT) .setExpiration(Date.from(Instant.ofEpochSecond(4622470422L))) .signWith( SignatureAlgorithm.HS256, TextCodec.BASE64.decode("Yn2kjibddFAWtnPJ2AFlL8WXmohJMCvigQggaEypa5E=") ) .compact();
set*(), claim()함수가 Payload 영역을 생성한다.
만약 payload 영역에 서비스에 맞게 개인적으로 추가하고 싶으면 claim()을 사용하면된다.
header/signature는 signWith()와 compact() 에서 생성한다.
참고로 signWith 함수 호출시 두번째 파라미터가 base64인코딩이거나 byte배열일 경우 alg은 무조건 hmac 이어야 한다.
if (key != null) { //jwt must be signed:
JwtSigner signer = createSigner(algorithm, key);
String base64UrlSignature = signer.sign(jwt);
jwt += JwtParser.SEPARATOR_CHAR + base64UrlSignature;
signature영역은 alg, key 조합으로 jwtSigner라는 객체를 생성하고, 이를 가지고 다시 한번 작업을 한뒤 base64로 인코딩 한다.
댓글
댓글 쓰기