[Server] JWT(Json Web Token)란?
JWT란?
JWT는 사용자를 인증하고 식별하기 위한 Claim 기반 웹 토큰이다. 토큰은 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담을 덜 수 있다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다.
JWT를 사용하면 RESTful 과 같은 환경에서 사용자 데이터를 주고 받을 수 있게 된다. 세션을 사용할 경우 쿠키를 통해 식별하고 서버에 세션을 저장했지만 JWT는 토큰을 사용자 측에서 저장하고 요청 시 단순히 HTTP 헤더에 토큰을 첨부하는 식으로 요청-응답을 처리한다.
1. JWT 로직 순서
① 사용자가 아이디와 비밀번호로 로그인 한다.
② 서버에서 정보를 검증한 후 정보가 일치한다면 서버에서 서명된(Signed) 토큰을 생성한다.
③ 생성한 토큰을 사용자에게 돌려준다.
④ 사용자 측에서 전달받은 토큰을 저장해둔다.
⑤ 서버에 요청할 때마다 해당 토큰을 서버에 함께 전달한다. 이 때 토큰을 HTTP Header에 첨부한다.
⑥ 서버에서 사용자로부터 온 토큰을 검증하고 요청에 응답한다.
※ 사용자가 로그아웃 하면 저장된 JWT 데이터를 제거한다.
2. JWT 구조
JWT는 헤더(Header), 내용(Payload), 서명(Signature)으로 이루어지며 각각의 부분을 이어주기 위해 . 구분자를 사용한다. 또한 Json 형태인 각 부분은 Base64로 인코딩 되어 표현된다. (Base64는 암호화된 문자열이 아니고 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.)
2-1) 헤더(Header)
{
"alg": "HS256",
"typ": JWT
}
헤더는 alg
와 typ
정보로 구성된다.
- alg: 서명(Signature)를 해싱하기 위한 알고리즘 지정(ex. HMAC SHA256, RSA)
- typ: 토큰의 타입을 지정
2-2) 페이로드(PayLoad)
페이로드에는 토큰에서 사용할 정보의 조각들인 Claim이 담겨있다.
클레임은 총 3가지로 나누어지며, JSON 형태로 다수의 정보를 넣을 수 있다.
즉, 서버와 클라언트가 주고받는 시스템에서 실제로 사용될 정보에 대한 내용을 담고 있다.
{
"sub": "1234567890",
"name": "John Doe" ,
"iat": 1516239022
}
- 등록된 클레임(Registered Claim)
토큰 정보를 표현하기 위해 정해진 종류의 데이터들로 선택적으로 작성이 가능하며 사용할 것을
권장한다. 또한 JWT를 간결하게 하기 위해 key는 모두 길이 3의 String이다.
- iss(issuer;발행자)
- sub(subject;제목)
- aud(audience;대상자)
- exp(expiration;만료시간), NumericDate 형식
- nbf(not before;활성날짜), 이 날이 지나기 전의 토큰은 활성화x
- iat(issued at;발급 시간), 발급 이후 경과 시간을 알 수 있다
- jti(jWT ID;JWT 토큰 식별자), 중복 방지를 위해 사용
- 공개 클레임(Public Claim)
사용자 정의 클레임으로, 공개용 정보를 위해 사용된다.
충돌 방지를 위해 URI 포맷을 이용한다.
{
"https://sylim.tistory.com":true
}
- 비공개 클레임(Private Claim)
사용자 정의 클레임으로, 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다.
{
"token_type":access
}
2-3) 서명(Signature)
서명은 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드이다.
헤더의 인코딩 값과 페이로드의 값을 합친 후 Base64로 인코딩하고, 인코딩한 값을 비밀키로 해쉬하고 이 값을 다시 BASE64로 인코딩하여 생성한다.
서명에서 사용하는 해쉬 알고리즘은 헤더에서 정의한 방식을 활용한다.
Signature = Base64Url(Header) + . + Base64Url(PayLoad) + server key
3. JWT 장점
- 헤더와 페이로드를 가지고 서명을 생성하므로 데이터 위변조를 막을 수 있다.
- 인증 정보에 대한 별도의 저장소가 필요없다.
- 클라이언트 인증 정보를 저장하는 세션과 다르게 서버는 무상태(StateLess)가 된다.
- 토큰 기반으로 다른 로그인 시스템에 접근 및 권한 공유가 가능하다.
- 필요한 모든 정보를 자체적으로 지니고 있다.
4. JWT 단점
- 정보가 많아질수록 키 크기가 길어져서 네트워크 부하를 야기할 수 있다.
- 페이로드 자체는 암호화되지 않기 때문에 중요 정보를 담을 수 없다.
- 토큰을 임의로 삭제하는 것이 불가능하다. (즉, 토큰 만료 시간을 꼭 넣어주어야 한다.)
#References
1] JSON 웹 토큰 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)
JSON 웹 토큰 - 위키백과, 우리 모두의 백과사전
JSON 웹 토큰상태인터넷 표준최초 출판일2010년 12월 28일 (2010-12-28)마지막 버전RFC 75192015년 5월조직IETF약어JWT JSON 웹 토큰(JSON Web Token, JWT, "jot”[1])은 선택적 서명 및 선택적 암호화를 사용하여 데
ko.wikipedia.org
2] [Server] JWT(Json Web Token)란? - MangKyu's Diary (tistory.com)
[Server] JWT(Json Web Token)란?
현대 웹서비스에서는 토큰을 사용하여 사용자들의 인증 작업을 처리하는 것이 가장 좋은 방법이다. 이번에는 토큰 기반의 인증 시스템에서 주로 사용하는 JWT(Json Web Token)에 대해 알아보도록 하
mangkyu.tistory.com