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 : 만료 일시를 확인할 수 있습니다.
댓글