지난번에 만들었던 토큰 파일을 파일 형식으로 저장해보도록 하겠습니다.
파일 저장보다 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 테스트를 쉽게 할 수 있는 방법이 있으면 좋을 것 같은데..
지금은 웹서비스를 만들어서 해봐야 할 것 같습니다.