JWT는 Json Web Token의 약자로 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰이다. 토큰을 발급 받고 매 통신마다 토큰 인증에 성공해야만 JSON 통신이 가능함.
1. JWT의 구조
- JWT의 구조는 Header, Payload Signature 세 가지로 구성되어 있다.
- 각각의 제외한 JSON 부분들은 하나의 데이터로 표현될 때 Base64로 인코딩되어 표현된다.
Header
{
"alg": "HS256",
"typ": "JWT"
}
-
- alg ⇒ JWT 구조에서 Signature에는 Header와 Payload가 합쳐져 특정 알고리즘으로 암호화가 진행이 된 다음에 만들어지는데, 그 때 사용되는 알고리즘이다. "alg": "HS256" 는 Signature 부분을 HS256 알고리즘으로 암호화 되었다는 뜻이다.
- typ ⇒ 토큰의 유형이다. JWT 토큰을 사용한다.
Payload
{
"sub": "1234567890",
"lat": 1516239022
}
-
- Payload(페이로드)에는 사용자의 인증 정보가 담긴다. 여기에 담기는 정보의 조각 단위를 Claim이라 불린다.
- Claim에는 등록된 클레임, 공개 클레임, 비공개 클레임 3가지 종류가 있는데 자주 사용되는 것은 등록된 클레임이다.
- iss ⇒ 토큰 발급자(issuer)
- sub ⇒ 토큰 제목(subject) 주로 사용자 이메일 사용한다.
- aud ⇒ 토큰 대상자(audience)
- exp ⇒ 토큰 만료 시간(expiration)
- nbf ⇒ 토큰 활성 날짜(not before)
- iat ⇒ 토큰 발급 경과 시간(issued at) 토큰 발급 이후의 경과 시간
- jti ⇒ JWT 토큰 식별자(JWT ID) 중복 방지를 위해 사용한다.
Signature
- Signature(서명)은 헤더와 페이로드가 합쳐져 암호화 후에 담겨져 있는 데이터다.
- 헤더(Header)와 페이로드(Payload)의 값을 각각 BASE64로 인코딩
- 인코딩한 헤더(Header)에서 정의한 알고리즘으로 암호화
- 암호화한 값을 다시 BASE64로 인코딩하여 생성
2. JWT 응용 원리
- 사용자가 아이디와 비밀번호를 입력하고 로그인을 요청
- DB 내 아이디 비밀번호 데이터와 일치하는지 확인
- 해당 사용자 정보를 기반으로 JWT 토큰 발급
- 응답 헤더에 해당 토큰을 추가하여 클라이언트로 전송하고 클라이언트는 이를 저장
- 이후 JSON 통신을 할 때마다 서버로 토큰을 요청 헤더에 추가하여 전송
- 서버에서 해당 토큰을 검증
- 검증이 완료되면 요청 데이터를 응답