본문 바로가기
CS

JWT란?

by 위시우 2024. 8. 21.

1. JWT 이란

유저를 인증하고 식별하기 위한 토큰기반 인증입니다. 

토큰 자체에 사용자의 권한정보나 서비스를 사용하기 위한 정보가 포함됩니다. 

stateless 인 환경에서 사용자의 데이터를 주고 받을 수 있습니다. 

session 을 사용할 경우 쿠키 등을 통해서 사용자를 식별하고 서버에 세션을 저장했지만, 토큰을 클라이언트에 저장하고 요청시 HTTP 헤더에 토큰을 첨부하는 것만으로도 데이터를 요청하고 응답받을 수 있습니다. 

 

2. JWT 구조

 

JWT 는 3 부분으로 구성되며, 각 부분은 점으로 구분하여 표현됩니다. 

1) 헤더

서명 시 사용하는 키, 사용할 타입, 서명암호화 알고리즘 의 정보가 담겨있습니다. 

  • kid : 서명 시 사용하는 키(Public/Private Key)를 식별하는 값
  • typ : 토큰 유형
  • alg : 서명 암호화 알고리즘 HS256(HMAC SHA-256), HS512, RS256(RSASSA SHA-256), ES256(ECDSA P-256 curve SHA-256)

2) 페이로드

토큰에 사용할 정보 조각들인 Claim 이 담겨있습니다. 

Claim 은 Key/Value 형태로 된 값을 가집니다. 

  • 저장되는 정보에 따라 등록된 클레임(Registered Claims), 공개 클레임(Public Claims), 비공개 클레임(Private Cliams)로 구분됩니다.

Claim 항목

  • iss : 토큰 발급자(issuer) – Public Claims
  • sub : 토큰 제목(subject) – Public Claims
  • iat : 토큰 발급 시간(issued at) – Public Claims
  • exp : 토큰 만료 시간(expiration) – Public Claims
  • roles : 권한 – Private Cliams

3) Signature 

  • Header(헤더) 에서 정의한 알고리즘 방식(alg)을 활용합니다.
  • Header(헤더)+ 페이로드(Payload)와 서버가 갖고 있는 유일한 key 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화합니다.
  • Header(헤더) 와 페이로드(Payload)는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature(서명)는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없습니다. 이는 토큰의 위변조 여부를 확인하는데 사용됩니다.

 

// Java Spring JWT 생성 및 검증 로직 구현
    private String buildAccessToken(
            Long memberId, MemberRole memberRole, Date issuedAt, Date expiredAt) {
        return Jwts.builder()
                .setIssuer(jwtProperties.getIssuer())
                .setSubject(memberId.toString())
                .claim(TOKEN_ROLE_NAME, memberRole.name())
                .setIssuedAt(issuedAt)
                .setExpiration(expiredAt)
                .signWith(getAccessTokenKey())
                .compact();
    }
  • setIssuer : 토큰 발급자(issuer) – Public Claims
  • setSubject : 토큰 제목(subject) – Public Claims
  • claim : 현재 프로젝트에서는 기업과 일반 유저를 구분하기 위해  "role" 이라는 key 에 memberRole 을 담았습니다.
  • setIssuedAt : 토큰 발급 시간(issued at) – Public Claims
  • setExpiration : 토큰 만료 시간(expiration) – Public Claims
  • signWith : Signature 를 설정합니다. 

 

아래는 위의 코드로 발급한 액세스토근을 파싱한 값입니다. 

 

  • alg : 서명 암호화 알고리즘으로 HS256 을 사용한 것을 볼 수 있습니다. 
  • setSubject : 토큰 제목(subject) 으로는 memberId 를 생성한 것을 확인할 수 있습니다. 
  • claim : 일반유저로 role USER 로 입력된 것을 확인할 수 있습니다. 
  • iat : 발급 일시를 확인할 수 있습니다. 
  • exp : 만료 일시를 확인할 수 있습니다. 

댓글