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( SignatureAlgor
http://changpd.blogspot.com/2021/04/jwt-1headerpayload.html 에이어서 두번째 signature 파싱처리 signature부분은 토큰의 변조 방지를 담당한다. 토큰내용이야 base64로 인코딩되어있어 얼마든지 디코딩이 가능하나 변조는 불가능해야 한다. jwt파싱 (step1-1, SignatureAlgorithm) 첫번째 파싱한 header를 다시 JwsHeader로 타입캐스팅한다. 그리고 header에 저장된 alg값을 읽어온다. 이값이 없으면 더이상 진행이 되지 않는다. // =============== Signature ================= if (base64UrlEncodedDigest != null ) { //it is signed - validate the signature JwsHeader jwsHeader = (JwsHeader) header ; SignatureAlgorithm algorithm = null; if (header != null ) { String alg = jwsHeader.getAlgorithm() ; if (Strings. hasText (alg)) { algorithm = SignatureAlgorithm. forName (alg) ; } } if (algorithm == null || algorithm == SignatureAlgorithm. NONE ) { //it is plaintext, but it has a signature. This is invalid: String msg = "JWT string has a digest/signature, but the header does not reference a valid signature " + "algori