Spring/Spring Boot
[Spring] Spring JWT 인코딩, 디코딩 하기 - Java Json 파싱
민돌v
2022. 8. 23. 16:40
같이 보면 좋을 연결된 포스팅들
- ✔️ Spring Jwt Refresh Token - 인증 인가의 흐름
- ✔️ [Spring] jwt란 - jwt 내부구조, 동작과정, 스프링에서 파싱하기
- 👉 [Spring] Spring JWT 인코딩, 디코딩 하기 - Java Json 파싱
이번에 포스팅할 내용은
- spring 에서 jwt 를 만들고, 외부에서 받아온 jwt 를 해석하는 방법과
- jwt 해석한 byte 정보를 json 으로 파싱해서 jwt payload 에서 원하는 정보를 추출하는 방법 입니다.
📗 Spring JWT 만들기
Token 을 만드는 방법까지는 아니고, 간단하게 Test를 위해 Spring 에서 JWT 만드는 방법입니다.
저는 jjwt 라이브러리를 사용했고, jjwt는 JWT 토큰 생성 및 JWT 토큰 파싱, 검증을 해주는 라이브러리 입니다.
implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.2'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.2'
예시
// 토큰 Builder
String jwt = Jwts.builder()
.setHeader(headers) // Headers 설정
.setClaims(payloads) // Claims 설정
.setSubject("user") // 토큰 용도
.setExpiration(ext) // 토큰 만료 시간 설정
.signWith(SignatureAlgorithm.HS256, key.getBytes()) // HS256과 Key로 Sign
.compact(); // 토큰 생성
📗 Spring 에서 JWT Payload 내용 확인하기
- Spring Boot Jwt get Payload
payload 부분만 따로 때서 base64로 디코딩하는 방법을 사용했습니다.
@Test
void jwts_test() {
String payload = "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ";
Base64.Decoder decoder = Base64.getUrlDecoder();
System.out.println(new String(decoder.decode(payload)));
}
📗 Java Json 파싱 방법
위의 사진처럼 JWT를 디코딩해 Json 값으로 담긴 payload를 일련의 문자열로 얻었습니다.
저걸, 규칙에 따라 자르고 가공하기에는, 불안전한 요소가 많으니
저는 이 문자열을 자바에서 Json 으로 파싱해, key-value 형태로 값을 얻고자 했습니다.
private String getEmail(final String accessToken) {
final String payloadJWT = accessToken.split("\\.")[1];
Base64.Decoder decoder = Base64.getUrlDecoder();
final String payload = new String(decoder.decode(payloadJWT));
JsonParser jsonParser = new BasicJsonParser();
Map<String, Object> jsonArray = jsonParser.parseMap(payload);
if (!jsonArray.containsKey("sub")) {
throw new TokenNotValidException("유요하지 않은 AccessToken 입니다");
}
return jsonArray.get("sub").toString();
}