Inflearn brand logo image

인프런 커뮤니티 질문&답변

이가은님의 프로필 이미지
이가은

작성한 질문수

웹소켓/STOMP 채팅서비스(spring, vue, redis)

JWT토큰생성

JWT 생성 시 subject 설정에 대한 질문

작성

·

31

0

안녕하세요.

JWT를 생성하는 코드(JwtTokenProvider.java의 createToken)에서는 Claims 객체를 먼저 생성하고 claims.setSubject()로 설정한 후, 이 claims를 builder에 전달하는 방식을 사용하고 계신데요.

Builder에도 setSubject() 메서드가 있는데, Claims 객체에서 먼저 설정하신 이유가 궁금합니다.

혹시 custom claim인 role을 함께 추가하기 위해서 Claims 객체를 먼저 생성하여 사용하신 건가요? 아니면 다른 이유가 있으신지 궁금합니다.

답변 3

0

bradkim님의 프로필 이미지
bradkim
지식공유자

안녕하세요~!

 

말씀해주신것처럼 저희 수업의 코드는 claims를 만들어서 세팅해주고 있습니다. 그런데, 가은님이 올려주신 코드처럼 claims 대신 setSubject를 따로 세팅해도 됩니다. 다만, 이 경우 role등 추가 커스텀 값을 세팅할때에는 .claim("role", role) 이런식으로 세팅해야할것으로 보여집니다.

 

그런데, 결국 추후에 token을 파싱해서 payload를 추출할때에 claim을 추출해야 합니다. 그래서 코드의 가독성을 높히기 위해서 token생성과 파싱 부분을 claims를 사용해서 세팅했다고 보시면 될것 같습니다.

 

token parsing관련 코드는 아래와 같습니다.

 

Claims claims = Jwts.parserBuilder()
        .setSigningKey(secretKey)
        .build()
        .parseClaimsJws(token)
        .getBody();

0

이가은님의 프로필 이미지
이가은
질문자

제가 생각하는 setSubject 모습은 아래와 같습니다.

String token = Jwts.builder()
                .setSubject(email)
                .claim("role", role)
                .setIssuedAt(now)
                .setExpiration(new Date(now.getTime()+expiration*60*1000L))
                .signWith(SECRET_KEY)
                .compact();

0

안녕하세요, 인프런 AI 인턴입니다. 이가은님.

JWT 토큰 생성 시 Claims 객체를 사용하여 setSubject()를 설정하는 이유에 대해 질문해 주셨군요.

  1. Claims 객체와 Builder의 역할:

    • Claims 객체는 JWT의 페이로드에 직접 저장될 클레임(데이터)들을 관리하는 역할을 합니다. 이 객체에 담긴 데이터는 JWT의 중요한 부분으로, 클라이언트와 서버 간에 교환될 정보를 포함합니다.

    • Builder.setSubject()도 직접적으로 서브젝트를 설정할 수 있지만, Claims 객체를 사용하면 커스텀 클레임을 쉽게 추가할 수 있습니다. 예를 들어, role과 같은 특정 사용자 정보나 권한을 포함시키고자 할 때 claims.put("role", role) 형태로 추가할 수 있습니다.

  2. Custom Claim 추가:

    • Claims 객체를 사용하면 다양한 커스텀 클레임을 추가하여 JWT의 페이로드를 세밀하게 조정할 수 있습니다. 따라서 createToken 메서드 내에서 Claims 객체를 먼저 생성하여 사용하시는 것이 일반적인 패턴이 됩니다.
  3. 장점:

    • Claims 객체를 통해 클레임을 한 번에 관리하면, 추후 클레임을 추가하거나 수정할 때 코드 관리가 용이해집니다. 이로 인해 JWT의 유연성을 높이고 실수를 줄일 수 있습니다.

이와 관련된 더 많은 정보를 확인하려면 아래의 질문 링크를 참고하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이가은님의 프로필 이미지
이가은

작성한 질문수

질문하기