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

JWS Example(nimbus)

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

JWS Create / Parse

*JWT 관련 자세한 설명 생략

 

 

▷ Example

 

/** 
 * JWS (JSON Web Signature) 생성 및 파싱 예시
 * 
 * ▶ JWS (JSON Web Signature)
 *   → 서버의 PRIVATE KEY로 서명하여 토큰화한 것
 *   → claim 노출, 서명을 통해 데이터의 무결성 및 인증 보장
 *
 * ▶ JWT (JSON Web Token)
 *   → JWS & JWE를 포함
 *   → 서버와 클라이언트 간 정보를 주고받을 때 HTTP 요청 헤더에 JWT 토큰을 포함하여 인증 수행
 *   → 구성:
 *     → Header: 토큰의 타입 및 암호화 알고리즘
 *     → Payload: claim 정보 (name: value), 공개/비공개 설정 가능
 *       → registered claim: JWTClaimsSet 제공
 *       → public claim: 사용자 정의
 *       → private claim: 시스템 또는 조직에서 사용하는 클레임
 *     → Signature: PRIVATE KEY를 사용하여 서명 (JWS에서만 해당)
 */
public static void jwsExample() throws Exception {

    /* JWS Header 정의: 사용할 알고리즘 설정 (HS512) */
    JWSHeader header =  new JWSHeader(JWSAlgorithm.HS512);

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

    /* JWS 서명자 설정 (비밀키를 사용하여 서명 생성) */
    String privateKey = "****************************PRIVATEKEY**************************"; // 실제 비밀키 사용 필요
    JWSSigner signer = new MACSigner(privateKey);
    SignedJWT jws = new SignedJWT(header, payload);
    jws.sign(signer);

    // 서명된 JWS 토큰 직렬화 및 출력
    String serializedJws = jws.serialize();
    System.out.println("> RESULT JWS: " + serializedJws);

    /* JWS 토큰 파싱 */
    SignedJWT signedJws = SignedJWT.parse(serializedJws);

    // 서명 검증 (공개 키로 서명을 검증)
    String publicKey = "****************************PUBLICKEY**************************"; // 실제 공개키 사용 필요
    JWSVerifier verifier = new MACVerifier(publicKey);
    
    // 서명 검증 후 결과 출력
    if ( !signedJws.verify(verifier) ) {
        System.out.println("> Parse FAIL: Signature verification failed.");
    } else {
        System.out.println("> Parse SUCCESS : " + signedJws.getJWTClaimsSet());
    }
}
> JWT Payload (registered claim) : {
    iss=토큰 발급자,
    sub=토큰 제목,
    aud=토큰 대상자,
    exp=1666336203,
    iat=1666336143,
    jti=2d326b73-9989-4fac-98de-90a775ec1579
}

> RESULT JWS: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiLthqDtgbAg7KCc66qpIiwiYXVkIjoi7Yag7YGwIOuMgOyDgeyekCIsImlzcyI6Iu2GoO2BsCDrsJzquInsnpAiLCJleHAiOjE2NjYyNTY5NTEsImlhdCI6MTY2NjI1Njg5MSwianRpIjoiZDk5ZWI4NWYtOWIzZi00MDd...

> Parse SUCCESS : {
    iss=토큰 발급자,
    sub=토큰 제목,
    aud=토큰 대상자,
    exp=1666336203,
    iat=1666336143,
    jti=2d326b73-9989-4fac-98de-90a775ec1579
}

> Parse FAIL: Signature verification failed.

 

 

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
Java 환경변수 설정  (0) 2022.05.10
Java 11 버전 설치 방법  (0) 2022.05.10

댓글