본문 바로가기
▶ Back-End/Java

JWS Example(nimbus)

by 오늘도 코딩 2022. 10. 20.
728x90
반응형

JWS Create / Parse

*JWT 관련 자세한 설명 생략

 

 

▷ Example

 

/** 
 * JWS Create / Parse
 * 
 * ▶ JWS(JSON WEB SIGNATURE)
 *	→ 서버의 PRIVATE KEY로 서명한 것을 토큰화 한것
 *	→ claim 노출
 *
 * ▶ JWT(JSON WEB TOKEN)
 *	→ JWS & JWE
 *	→ 서버와 클라이언트 간 정보를 주고 받을때 Http request 헤더에 JSON 토큰을 넣은 후 
 *		별도의 인증 과정없이 헤더에 포함되어 있는 JWT정보를 통해 인증
 *	→ 구성
 *		→ Header : 토큰의 타입과 암호화 알고리즘
 *		→ Payload : claim 정보를 포함( name : value ), 공개/비공개 설정 가능
 *			→ registered claim : JWTClaimsSet 제공
 *			→ public claim : 사용자 정의
 *			→ private claim : 
 * 		→ Signaure : PRIVATE KEY
 * */
public static void jwsExample() throws Exception {

    /** JWS Header */
    JWSHeader header =  new JWSHeader(JWSAlgorithm.HS512);

    /** JWS Payload (registered claim) */
    JWTClaimsSet payload = new JWTClaimsSet.Builder()
            .issuer("토큰 발급자")
            .subject("토큰 제목")
            .audience("토큰 대상자")
            .expirationTime(new Date(new Date().getTime() + 1000*60)) // 토큰의 만료시간 
            .issueTime(new Date()) // 토큰이 발급된 시간
            .jwtID(UUID.randomUUID().toString())  // JWT의 고유 식별자
            .build();
    System.out.println("> JWT Payload (registered claim) : " + payload.getClaims());

    /** JWS Signaure */
    final JWSSigner signer = new MACSigner("****************************PRIVATEKEY**************************");
    final JWSVerifier verifier = new MACVerifier("****************************PRIVATEKEY1**************************");

    SignedJWT jws = new SignedJWT(header, payload);
    jws.sign(signer);
    jws.serialize();

    System.out.println("> RESULT JWS : " + jws.serialize());

    /** Parse */
    final SignedJWT signedJws = SignedJWT.parse(jws.serialize());

    if ( !signedJws.verify(verifier) ) {
        System.out.println("> Parse FAIL : " + signedJws.getJWTClaimsSet()); // claim 노출
        throw new Exception("Parse FAIL");
    } else {
        System.out.println("> Parse SUCCESS : " + signedJws.getJWTClaimsSet());
    }

}

/*
    결과 : 
        > JWT Payload (registered claim) :
            {
                iss = 토큰 발급자,
                sub = 토큰 제목,
                aud = [토큰 대상자],
                exp = Thu Oct 20 18: 09: 11 KST 2022,
                iat = Thu Oct 20 18: 08: 11 KST 2022,
                jti = d99eb85f - 9b3f - 407d - 9740 - 4aab3ae9ea0b
            }

        > RESULT JWS : 
            eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiLthqDtgbAg7KCc66qpIiwiYXVkIjoi7Yag
            7YGwIOuMgOyDgeyekCIsImlzcyI6Iu2GoO2BsCDrsJzquInsnpAiLCJleHAiOjE2N
            jYyNTY5NTEsImlhdCI6MTY2NjI1Njg5MSwianRpIjoiZDk5ZWI4NWYtOWIzZi00MDd
            kLTk3NDAtNGFhYjNhZTllYTBiIn0.z7NDt_JxNOiedhlOIkBhGNSGO_jipbayNU5Wj
            qb-cqiMi_vUVy81by0ae2OeioOrpbBcc6v5lPBd2MJtd4VIuw
        
        > Parse FAIL : 
            {
                "sub": "토큰 제목",
                "aud": "토큰 대상자",
                "iss": "토큰 발급자",
                "exp": 1666256951,
                "iat": 1666256891,
                "jti": "d99eb85f-9b3f-407d-9740-4aab3ae9ea0b"
            }
            
        Exception in thread "main" java.lang.Exception: Parse FAIL
*/

 

 

728x90
728x90

'▶ Back-End > Java' 카테고리의 다른 글

JWE Example(nimbus)  (0) 2022.10.21
Create RSA Keypair(.pem)  (0) 2022.10.21
Create UUID ver4  (0) 2022.10.20
ArrayList 간단한 페이징  (0) 2022.10.20
Java 환경변수 설정  (0) 2022.05.10

댓글