반응형

지난번에 만들었던 토큰 파일을 파일 형식으로 저장해보도록 하겠습니다.
파일 저장보다 DB 저장 할 수도 있지만 지금은 단순 테스트가 목적이기 때문입니다.

먼저 이전에 만들었던 토큰 생성 코드를 확인해 보겠습니다.

<소스코드>

위 소스코드에서 withClaim("jwt", "testcase")을 사용하는 경우
데이터가 추가 될 때마다 withClaim("jwt1", "testcase"), withClaim("jwt2", "testcase") 
식으로 계속 추가해야 합니다.

그래서 이번에는 withHeader를 이용해 보겠습니다.
withHeader는 Map 형태로 저장이 가능하기 때문에 우선 HashMap을 정의하고
데이터를 선언 한 다음 추가 하면 됩니다.

Map<String, Object> headerClaims = new HashMap(); 
headerClaims.put("jwt", "jwt-test"); 
headerClaims.put("jwt1", "jwt1-test"); 
headerClaims.put("jwt2", "jwt2-test"); 

그리고 토큰 생성시 다음과 같이 하시면 됩니다.

String signed = JWT.create().withIssuer("deluser").withHeader(headerClaims).withClaim("test1", "12344").withClaim("keystring", "abcde").sign(a1); 


여기까지 이상이 없다면 생성 토큰을 파일로 생성해 보겠습니다.

파일은 일반 텍스트 파일이 아닌 RSA 키를 이용해 암호화 하겠습니다.
파일 생성은 bouncycastle 라이브러리를 사용했습니다.

생성된 암호화 문자는 다음과 같은 형태입니다.

-----BEGIN RSA PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHZFEgEJAfV5Mqp5CpIIuOFUeGlqWGqEUBgIw/PePNPWEE1jpCvo/oHCvY9Q7O4iWnj4rWyAE/NXAKsuqh+55QmcePwUo+xuJY6fTP7MXGvlk/qd/Wb+SFueXuwx6sp0wgvlCPNWOV7X1sPeLxC+ll+oawPe1Je96gyWbJ2WF81wIDAQAB
-----END RSA PUBLIC KEY-----

해당 문자를 FileWrite를 이용해 로컬에 쓰기를 하면 됩니다.

해당 기능을 하는 함수코드는 다음과 같습니다.

Map<String, Object> headerClaims = new HashMap(); 
headerClaims.put("jwt", "jwt-test"); 
headerClaims.put("jwt1", "jwt1-test"); 
headerClaims.put("jwt2", "jwt2-test"); 

System.out.println("## testCase2 private : " + PRIVATE_KEY_FILE_RSA); 
System.out.println("## testCase2 public : " + PUBLIC_KEY_FILE_RSA); 
try { 
Algorithm a1 = Algorithm.RSA512((RSAKey) PemUtils.readPrivateKeyFromFile(PRIVATE_KEY_FILE_RSA, "RSA")); 
Algorithm a2 = Algorithm.RSA512((RSAKey) PemUtils.readPublicKeyFromFile(PUBLIC_KEY_FILE_RSA, "RSA")); 
String signed = JWT.create().withIssuer("deluser").withHeader(headerClaims).withClaim("test1", "12344").withClaim("keystring", "abcde").sign(a1); 
assertThat(signed, is(notNullValue())); 


JWTVerifier verified = JWT.require(a2).build(); 
assertThat(verified, is(notNullValue())); 

DecodedJWT jwt = verified.verify(signed); 
System.out.println("## testCase2 : " + signed); 
System.out.println("## testCase2 header : " + jwt.getHeader() + ", alg : " + jwt.getAlgorithm() + ", type : " + jwt.getType()); 
System.out.println("## testCase2 payload : " + jwt.getPayload() + ", issuer : " + jwt.getIssuer()); 
System.out.println("## testCase2 claims : " + jwt.getClaims()); 
Claim cl = jwt.getClaims().get("keystring"); 
System.out.println("## testCase2 cl >>"+ cl.asString()); 
System.out.println("## testCase2 h >>" + jwt.getHeaderClaim("jwt").asString()); 
File fila = new File(PUBLIC_KEY_FILE_RSA); 
String keyStr = PemUtils.parsePEMFile2(fila); 
   
String privKeyPEM = keyStr.replaceAll("-----BEGIN RSA PUBLIC KEY-----", ""); 
   
privKeyPEM = privKeyPEM.replaceAll("-----END RSA PUBLIC KEY-----", ""); 

System.out.println(privKeyPEM); 
Base64 b64 = new Base64(); 
byte [] decoded = b64.decode(privKeyPEM); 

a2 = Algorithm.RSA512((RSAKey) PemUtils.getPublicKey2(decoded, "RSA")); 
System.out.println(generateUrl(signed)); 
} catch(Exception e) { 
e.printStackTrace(); 
} 


위 코드의 마지막을 부분을 확인하면 generateUrl(signed)라는 메서드가 사용되었는데
이 메소드에서는 토큰의 시그니처 값으로 URL을 생성합니다.

이후에는 웹서비스에서 해당 URL을 받아 처리해주면 되겠습니다.

RestAPI 테스트를 쉽게 할 수 있는 방법이 있으면 좋을 것 같은데..
지금은 웹서비스를 만들어서 해봐야 할 것 같습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기