Spring/Spring Boot

[Spring] Spring JWT 인코딩, 디코딩 하기 - Java Json 파싱

민돌v 2022. 8. 23. 16:40
같이 보면 좋을 연결된 포스팅들

 

 

 

이번에 포스팅할 내용은

  1.  spring 에서 jwt 를 만들고, 외부에서 받아온 jwt 를 해석하는 방법과
  2.  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();
}

 

굿!