Spring
💡 JWT(JSON Web Token) 이란?
kyungeeee
2022. 12. 9. 00:05
- JWT(JSON Web Token)
- 당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰
- 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미
- URL로 이용할 수 있는 문자열로만 구성 → HTTP 구성요소 어디든 위치할 수 있음
- 디지털 서명이 적용돼 있어 신뢰할 수 있음
- 서버와의 통신에서 권한 인가를 위해 사용
- JWT 기반 인증은 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별하는 방식
🌈 JWT 구조
JWT는 점(’.’)으로 구분된 아래의 세 부분으로 구성됨
헤더(Header)
- 검증과 관련된 내용을 담고 있음
- 완성된 헤더는 Base64Url 형식으로 인코딩 되어 사용됨
- 속성
- alg : 해싱 알고리즘 지정
- SHA256, RSA을 주로 사용하며, 토큰을 검증할 때 사용되는 서명 부분에서 사용
- typ : 토큰의 타입 지정
- alg : 해싱 알고리즘 지정
내용(Payload)
- 토큰에 담는 정보를 포함
- 속성(클레임-Claim)
- 등록된 클레임(Registered Claims)
→ 필수는 아니지만 토큰에 대한 정보를 담기 위해 이미 이름이 정해져 있는 클레임을 뜻함- iss : JWT의 발급자(Issuer) 주체
- sub : JWT의 제목(Subject)
- aud : JWT의 수신인(Audience)
- exp : JWT의 만료시간(Expiration) → 시간은 NumericDate 형식으로 지정해야함
- nbf : ‘Not Befor’
- iat : JWT가 발급된 시간(Issued at)
- jti : JWT의 식별자(JWT ID) → 중복 처리 방지
- 공개 클레임(Public Claims)
→ 키 값을 마음대로 정의 할 수 있음(단, 충돌이 발생하지 않는 이름으로 정의) - 비공개 클레임(Private Claims)
→ 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임을 의미
- 등록된 클레임(Registered Claims)
서명(Signature)
- 인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성함
🌈 JWT 생성(디버거 사용)
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
해당 웹사이트에서 쉽게 JWT 를 생성할 수 있다.
🌈 JWT 실습
1. dependency 👉 JSON Web Token Support For The JVM
2. utils 패키지 생성 👉 JwtTokenUtil 클래스 생성
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtTokenUtil {
public static String createToken(String userName, String key, long expireTimeMs) {
Claims claims = Jwts.claims();
claims.put("userName", userName);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(new Date(System.currentTimeMillis() + expireTimeMs))
.signWith(SignatureAlgorithm.HS256, key)
.compact();
}
}
Claims
- 일종의 map으로 key, value로 값을 담을 수 있음
- .put() 으로 값 추가
IssuedAt()
- 현재시간 세팅
Expiration
- 현재시간 + 끝나는 시간
signwith
- 서명