JWT의 구조는 header(json) + payload(json) + signature 로 이루어져 있다.
헤더에는 어떻게 검증하는지 시그니처를 해싱하기 위한 알고리즘 정보들이 담겨져 있다.
페이로드는 JWT에 대한 내용 즉 서버와 클라이언트가 주고받기로 한 값들로 구성되어 있다.
시그니쳐는 토큰의 유효성을 검증하기 위한 문자열로 구성되더 있다.
JWS는 클라이언트가 로그인을 시도할 경우 > 서버에서 payload에 담고 싶은 내용을 담아(로그인 한 사람의 정보, 접근권한) 서명하고 Token을 발행해준다. 그렇게 된다면 클라이언트는 다음 통신에서 토큰값 함께 전달하고 서버에서는 Token을 수신하여 검증 후 절차 로직을 실행한다.
Claim : 사용자에 대한 프로퍼티를 담고있는 정보로 3가지 타입이 존재한다.
- Reserved Claims : 정보 교환에 유용하도록 미리 정의되어 있는 클레임 이 클레임은 필수적이지 않고 Optional이다.
- Public Claims : 충돌이 방지된 네임스페이스를 담고있는 URI와 같이 이름이 충돌되지 않도록 해야함
- Private Claims : 서버와 클라이언트가 정보를 공유하기 위해 사용하기로한 클레임 정보
/**
* 토큰생성
*/
String jwt = Jwt.builder()
//header
.setHeaderParam("typ","JWT") // 토큰타입
.setSubject("EXMAPLE") // 토큰제목
//payload
.claim("username","uk") // private claim
.claim("userage","26") // private claim
.setIssuedAt(new Date(System.currentTimeMillis()) // 토큰 생성날짜
.setExpiration(new Date(System.currentTimeMillis() + 3600) // 토큰 유효시간
//signatue
.signWith(SignatureAlgorithm.HS512, "Uk".getByte("UTF-8"))
.compact();
/**
* 토큰검증
*/
try{
Jwts.parser().setSignatureKey("Uk".getByte("UTF-8")).parseClaimsJws(jwt);
//return true;
} catch(Exception e) {
e.printStackTrace();
}