JWT(JSON Web Tokens)이란?
- 두 개체에서 JSON 객체를 사용하여 가볍고 정보를 안전성 있게 전달하는 방식
- https://tools.ietf.org/html/rfc7519
JWT의 구성요소는?
header.payload.signature
header
- 알고리즘과 token 타입으로 구성된다.
{ "alg": "HS256", "typ": "JWT" }
Claim(payload)
- 실제로 데이터를 담는 공간이다.
- 추가적으로 JWT에 예약된 키워드가 있다.
- 사용하는 라이브러리에 따라 예약어를 지원할수도 안할수도 있다.
iss
: 토큰 발급자sub
: 토큰 제목aud
: 토큰 대상자exp
: 토큰의 만료시간nbf
: Not Beforeiat
: 토큰이 발급된 시간jti
: JWT의 고유 식별자
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
signature
- 토큰의 무결성을 검증하기 위한 signature hash값
- header와 payload 그리고 secret key으로 구성된 문자열을 정해진 알고리즘으로 hashing한 값
JWT 인증 절차는?
- 사용자가 id와 password를 입력하여 로그인을 시도
- 서버는 요청을 확인하고 secret key를 통해 Access token을 발급
- 인증 이후 사용자가 API를 요청할 때
Authorization header
에Access token
을 담아서 요청 - 서버는
JWT Signature
를 체크하고 Payload로부터 user 정보를 확인하고 원하는 자원을 Return
주의해야할 점은 없을까?
- JWT는 안전한 HttpOnly 쿠키로 저장
- Cross-Site Scripting(XSS) 공격을 방지
- 민감한 데이터는 JWT로 저장하면 안된다.
- 쉽게 Debug가능