: JSON Web Token(JWT)은 웹 표준(RFC 7519)으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가 수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달
1. 회원 인증
: 유저가 로그인을 하면, 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달.
그 후, 유저가 서버에 요청을 할 때마다 JWT를 포함하여 전달함. 서버가 클라이언트에게서 요청을 받을 때마다, 해당 토큰이 유효하고 인증됐는지 검증을 하고, 유저가 요청한 작업에 권한이 있는지 확인하여 작업을 처리함.
서버 측에서는 유저가 로그인 되어있는지 안 되어있는지 신경 쓸 필요가 없고, 유저가 요청을 했을 때 토큰만 확인하면 되니, 세션 관리가 필요 없어서 서버 자원을 많이 아낄 수 있음.
2. 정보 교류
: JWT는 두 개체 사이에서 안정성 있게 정보를 교환하기 좋은 방법
그 이유는, 정보가 sign이 되어있기 때문에 정보를 보낸 이가 바뀌지 않았는지, 또 정보가 도중에 조작되지는 않았는지 검증할 수 있음.
.
을 구분자로 3가지의 문자열로 되어있음: Header는 두가지의 정보를 가지고 있음
HMAC SHA256
혹은 RSA
가 사용되며, 이 알고리즘은 토큰을 검증할 때 사용되는 signature 부분에서 사용: Payload 부분에는 토큰을 담을 정보를 가지고 있음
여기에 담는 정보의 한 '조각'을 claim(클레임)이라고 부르며, 토큰에는 여러게의 claim을 넣을 수 있음
: 등록된 클레임은 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임. 등록된 클레임의 사용은 모두 선택적(optional)
iss
: 토큰 발급자(issuer)sub
: 토큰 제목(subject)aud
: 토큰 대상자(audience)exp
: 토큰의 만료시간(expiration), 시간은 NumericDate 형식으로 되어있어야 하며(ex. 1480849147370) 언제나 현재 시간보다 이후로 설정되어 있어야 함nbf
: 토큰의 활성 날짜. NumericDate 형식으로 날짜를 지정하며, 이 날짜가 지나기 전까지는 토큰이 처리되지 않음iat
: 토큰이 발급된 시간(issued at), 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단할 수 있음jti
: JWT의 고유 식별자로서, 주로 중복적인 처리를 방지하기 위하여 사용. 일회용 토큰에 사용하면 유용함: 공개 클레임은 충돌이 방지된(collision-resistant) 이름을 가지고 있어야 하며, 충돌을 방지하기 위해서는 클레임 이름을 URI 형식으로 만듦
{
"https://youngs.com/jwt_claims/is_admin": true
}
: 비공개 클레임은 양 측간에(보통 클라이언트 <-> 서버) 협의하에 사용되는 클레임 이름. 공개 클레임과는 달리 이름이 중복되어 충돌이 될 수 있으니 사용할 때 유의해야 함
{
"username": "youngs"
}
: 헤더의 인코딩 값과, 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬하여 생성