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

JWE Example(nimbus)

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

JWE Create / Parse

*JWT 관련 자세한 설명 생략

 

 

▷ Example

 

/** 
 * JWE (JSON Web Encryption) 암호화 및 복호화 예시
 * 
 * ▶ JWE (JSON Web Encryption)
 *   → 서버와 클라이언트 간 암호화된 데이터를 토큰화한 것
 *   → 클라이언트에게 전달되는 데이터가 암호화되어 기밀성 보장
 *
 * ▶ 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 jweExample() throws Exception {

    /* JWE RSA KEYPAIR */
    final KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    // RSA 키 페어 생성
    HashMap<String, String> rsaKeyPair = getKeypair(); // RSA 키 쌍을 얻는 메소드 호출
    final String publicKey = rsaKeyPair.get("publicKey");
    final String privateKey = rsaKeyPair.get("privateKey");

    // 공개키
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);
    RSAEncrypter encryptionKey = new RSAEncrypter(rsaPublicKey);

    // 개인키
    PKCS8EncodedKeySpec pKCS8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pKCS8EncodedKeySpec);
    RSADecrypter rsaDecrypter = new RSADecrypter(rsaPrivateKey);

    /** JWE Header 정의: 사용할 알고리즘 설정 (RSA_OAEP_256, A256CBC_HS512) */
    JWEHeader header = new JWEHeader(JWEAlgorithm.RSA_OAEP_256, EncryptionMethod.A256CBC_HS512);

    /** JWE Payload (Registered Claim) */
    JWTClaimsSet payload = new JWTClaimsSet.Builder()
            .issuer("토큰 발급자")
            .subject("토큰 제목")
            .audience("토큰 대상자")
            .expirationTime(new Date(System.currentTimeMillis() + 1000 * 60)) // 만료 시간
            .issueTime(new Date()) // 발급 시간
            .jwtID(UUID.randomUUID().toString()) // 고유 식별자
            .build();

    // JWT Payload 내용 출력
    System.out.println("> JWT Payload (registered claim) : " + payload.getClaims()); 

    /** JWE Claim 암호화 */
    EncryptedJWT encryptedJWT = new EncryptedJWT(header, payload);
    encryptedJWT.encrypt(encryptionKey);
    String serializedJWE = encryptedJWT.serialize();

    // 직렬화된 JWE 출력
    System.out.println("> RESULT JWE : " + serializedJWE); 

    /** JWE 파싱 */
    EncryptedJWT decryptedJWT = EncryptedJWT.parse(serializedJWE);

    // 암호화된 상태 출력
    System.out.println("> JWE STATE (Encrypted) : " + decryptedJWT.getState()); 
    System.out.println("> ENCRYPTED : " + decryptedJWT.getJWTClaimsSet()); 

    /** JWE Claim 복호화 */
    decryptedJWT.decrypt(rsaDecrypter);

    // 복호화된 상태 출력
    System.out.println("> JWE STATE (Decrypted) : " + decryptedJWT.getState()); 
    System.out.println("> DECRYPTED : " + decryptedJWT.getJWTClaimsSet()); 
}
> JWT Payload (registered claim) : { 
    iss=토큰 발급자, 
    sub=토큰 제목, 
    aud=토큰 대상자, 
    exp=1666336203, 
    iat=1666336143, 
    jti=2d326b73-9989-4fac-98de-90a775ec1579 
}

> RESULT JWE : eyJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.ELTN-5lp5CjRGbm0JdxX_twciS5MXFVRIRAlxn7tkPVj0PcijmfQE7ovMlKx8kT6b7cTVcASrOWhJQdQ03SDszXzew-2Hg1pgcmnFyzkOThTmxfYecQJBVbNPi0QkNNknk7v5vKU3I2CLFyaGrssTjpUudoD_0SpigSs51J7qRPN70VT0io4ni0IwiOHxPTY55dJmbsXUYKzisqY1Eoj6nn-q9cZz5Ms92SvuaXLEkxz7fNAOt4QyJKSWstwCy93eu3l_jTF6xw1rO1gJ81i-3xb9nd_ZxNtpNQQM_lTL7SeYxt2A01IoQj9rKulUwCLCIGs9Mr-ThE44ewHNpg43Q.ZARSHNZ0Hi1Bd6gKxnVRPw.gxDmRHdqTbXa6DIauWmvxejVgcmS1tSIp1L6S_9VNeQdpBYOYKyrwlYVjJsqb7f9OvSQv_XWil7rhS--MQyTz4c8-sp9HTRdiIuI55LMZsHJDaMtDIMTNxrRS9GSKUcTRQq8R0TxhroEaOP8KlR1F5Dqg9MYhbRHUM7n1mtxl20kYFBlyZPk2-vsNvTE5IKSk4zEJ430WEVOLmNx1ETxew.aZJOSchVsWWFsQoArsfqfYQNZpuG2CYIdnLJ-XmMsFk

> JWE STATE (Encrypted) : ENCRYPTED
> ENCRYPTED : null

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

 

 

▷ 관련 글

 

Create RSA Keypair(.pem)

RSA Keypair 생성 메소드 /** * RSA Keypair(.pem) Create Method */ public static HashMap getKeypair() { HashMap keypairMap = new HashMap(); try { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048);

coding-today.tistory.com

 

Create JWT(nimbus)

JWT 생성 메소드 *JWE *자세한 설명 생략 /** * JWT CREATE * * @return String */ public String JWTCreate() { String jwt = ""; try { /** JWE RSA KEYPAIR */ final KeyFactory keyFactory = KeyFactory.getInstance("RSA"); /* Encryption Key */ final X509

coding-today.tistory.com

 

VERIFY JWT(nimbus)

JWT 검증 메소드 *JWE *자세한 설명 생략 /** * JWT VERIFY * * @param HttpServletRequest * @param resVO * @return CmmResVO */ public CmmResVO JWTVerify(HttpServletRequest req, CmmResVO resVO) { try { final String jwt = req.getHeader("Authorization

coding-today.tistory.com

 

 

728x90
728x90

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

SpringBoot에서 MQTT Client + WebFlux 구축  (0) 2022.12.02
SpringBoot JSP 설정  (0) 2022.12.01
Create RSA Keypair(.pem)  (0) 2022.10.21
JWS Example(nimbus)  (0) 2022.10.20
Create UUID ver4  (0) 2022.10.20

댓글