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
}
▷ 관련 글
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 |
댓글