JWT 인증 절차
// claim 생성 String claim = String.format("{\"iss\":\"%s\",\"sub\":\"%s\",\"iat\":%d,\"exp\":%d}", client_id, service_account, iat, exp); //String claim = String.format("{\"iss\":\"%s\",\"sub\":\"%s\",\"iat\":%d,\"exp\":%d}", "abcd", "46c4f281f81148c9b846c59262ae5888@example.com", 1634711358, 1634714958); String base64_claim = Base64.getEncoder().encodeToString(claim.getBytes()); String jwt = String.format("%s.%s",base64_header,base64_claim); // 암호화 키 조회 StringBuilder contentBuilder = new StringBuilder(); try (BufferedReader br = new BufferedReader(new FileReader(application.getRealPath("jwt_test.key")))) { String line; while ((line = br.readLine()) != null) { contentBuilder.append(line).append("\n"); } } catch (IOException e) { e.printStackTrace(); } String privateKeyString = contentBuilder.toString(); // 암호화 키 생성 byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString.replaceAll("-----BEGIN PRIVATE KEY-----", "").replaceAll("-----END PRIVATE KEY-----", "").replaceAll("\\s+", "")); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // 암호화 Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(jwt.getBytes()); byte[] signatureBytes = signature.sign(); // base64 인코딩 String encodedSignature = Base64.getEncoder().encodeToString(signatureBytes); // jws 생성 String jws = jwt + "." + encodedSignature; |
댓글3
업데이트 된 답글입니다.
Steve_
바로 찾기는 어려워 보여 전자서명 암호화 전에.. 에러 코드에 딸린 문서를 참고하셔서 JWT 형식에 만족되었는지.. 헤더 RS256 정의되었는지와 BASE64 인코딩 등 순차적으로 다시 점검해보셔야 할 것 같습니다. ㅠㅠ
2024.04.01
업데이트 된 답글입니다.
TEST 작성자
정상적으로 전자서명 암호화가 되고 있는지 우선적으로 확인이 필요할 것 같네요.
말씀하신 헤더나, 본문 값은 정상적으로 인코딩 되고 있는 것 같습니다.
2024.04.01
업데이트 된 답글입니다.
TEST 작성자
claim을 base64 인코딩 할 때, 뒤에 =이 자동으로 붙는데, 제거해줘야 하고.
전자서명 후, = 제거, + 는 -로, /는 _로 변경해줘야 하네요.
2024.04.01
궁금한 점을 해결하지 못하셨나요?
지금 바로 NAVER WORKS 사용자들에게 물어보세요!