티스토리 뷰

Programming/Web

JWT (Json Web Token)

혤혤혤 2017. 1. 5. 12:33

원문: https://jwt.io/introduction/

JWT란? 

JWT는 Json 객체를 이용하여 서로 다른편으로 정보를 안전하게 전달하기 위하여 자급 자족 방식으로 간결하게 정의하는 공개된 표준이다. 이러한 정보는 유효하고 신뢰될 수 있다. 왜냐하면 디지털 사인화 되었기때문이다. JWT들은 (HMAC 알고리즘을 사용하는) 암호를 사용하거나 RSA를 사용하는 퍼블릭/프라이빗 키 쌍을 이용하여 사인화 되었다. 

  • Compact 간결한 : 사이즈가 작다. JWTs은 URL이나 Post의 파라미터, 또는 HTTP 헤더 안에 포함되어 전송될 수 있다. 추가적으로 작다는것은 빠르게 전달된다는 의미가 된다. 

  • Self-contained: Payload는 사용자에 대해 모든 필수 정보를 포함하고 있어 데이터베이스 쿼리를 두번이상 할 필요가 없습니다. 

시나리오

Authentication 인증 : 한번 로그인 후 이후의 모든 request는 JWT를 포함하고 있어서 이것이 사용자에게 서비스를 이용할 수 있도록 인증받게함. 
Information Exchange 정보 교환: JWT는 디지털 사인화 되었기때문에 안전한 정보 교환이 가능한다. 그래서 전달한 사람이 누구인지를 알 수 있게 해준다. 추가적으로 디지털 사인이 header와 payload를 계산하게 해주고 내용이 훼손되지 않았다고 확인시켜준다.

JWT 구조

headerpayloadsignature 3개의 부분이 있고 (.)으로 구분 된다.
xxxxx.yyyyy.zzzzz

  • Header: 토큰 타입 / 사용된 해쉬 알고리즘(HMAC SHA256 or RSA) 정보를 담고 있다. 
{
  "alg": "HS256",
  "typ": "JWT"
}
그리고 이 header Json은  base64 인코딩 방식으로 인코딩 된어 토큰의 처음에 위치 된다. 
  • Payload: 요청된 정보를 포함한다. 일반적으로 사용자 정보를 많이 포함한다. 또는 메타 데이터를 담고 있기도 한다. 요청은 예약, 공개, 비공개 3가지 타입이 있다. 
      • 예약된: 유용하고, 공동으로 사용할 수 있는 세트를 제공하기 위해서 의무사항은 아니지만 권장사항으로 미리 정의된 세트이다. 예시) iss (발행자), exp (만료 시간), sub (주제), aud (청중) 
      • 공개된: JWT를 사용하는 사람들이 자유롭게 정의. 충돌을 피하기 위해 IANA JSON 웹 토큰 레지스트리에 정의되거나 충돌 방지 네임 스페이스가 포함 된 URI로 정의
      • 비공개: 이것은 사용에 동의한 사람들간에 정보를 공유하기 위한 사용자 요청
 Payload 예시
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
그리고 이 payload Json은  base64 인코딩 방식으로 인코딩 된어 토큰의 두번째에 위치 된다
  • Signature: 서명을 생성하기 위해서는 당신은 인코딩된 헤더, 인코딩된 페이로드, Secret(암호), 헤더에서 사용한 특정 알고리즘을 갖고 있어야 합니다. 
예 - 만약 당신이 HMAC SHA256알고리즘을 사용하여 싸인을 생성하려고 하면 이것은 다음과 같은 방법으로 생성됩니다. 

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
서명은 JWT 발신자가 자신이 말하는 사람인지 확인하고 내용이 훼손되지 않았는지 검사한다. 

Web에서 JWT의 사용

사용자가 로그인을 하면 사용자는 서버로 부터 JWT를 받게 되고 이것을 로컬 저장소나 쿠키에 저장해 둔다. (JWT로인해서 과거에 세션을 이용한 접근에서 쿠키를 사용하는 방식으로 변경됨.)
그리고 사용자는 보호된 라우트나 정보원에 접근을 원할때마다 사용자 대리는 JWT를 Bearer 체계를 사용해 Authorization 헤더에 담아서 전송한다.

Authorization: Bearer <token>

 사용자의 상태를 서버의 메모리에 저장하지 않는것은 말할필요 없는 인증 메카니즘이다. 서버의 보호되는 라우트는 Authorization 헤더 안의 유효한 JWT를 체크하고 그것이 존재한다면, 정보에 접근하는 것을 허가한다. JWT들이 자급자족 방식이기 때문에, 모든 필요한 정보는 그안에 존재한다. 그래서 데이터베이스 쿼리에 필요한 많은 시간을 줄요준다. 

이것은 상태가 없고 다운스트림 서비스에 요청을 보내는 data api에 당신이 전적으로 의존하도록 허락합니다. 어떤 도메인이 APIs를 제공하는지는 문제가 되지 않는다. 따라서 Cross-Origin Resource Sharing (CORS)은 쿠키를 사용할수 없는 것에 대해서 이슈가 되지 않을 것이다. 


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함