개발 Note/Etc.

[Server] JWT(Json Web Token)란?

sylim95 2022. 4. 8. 03:18

출처:JSON Web Tokens - jwt.io

 

JWT란?

JWT는 사용자를 인증하고 식별하기 위한 Claim 기반 웹 토큰이다. 토큰은 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담을 덜 수 있다. JWT는 토큰 자체를 정보로 사용하는 Self-Contained 방식으로 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다.

 

JWT를 사용하면 RESTful 과 같은 환경에서 사용자 데이터를 주고 받을 수 있게 된다. 세션을 사용할 경우 쿠키를 통해 식별하고 서버에 세션을 저장했지만 JWT는 토큰을 사용자 측에서 저장하고 요청 시 단순히 HTTP 헤더에 토큰을 첨부하는 식으로 요청-응답을 처리한다.

 


1. JWT 로직 순서

출처: 🍪 프론트에서 안전하게 로그인 처리하기 (ft. React) (velog.io)

① 사용자가 아이디와 비밀번호로 로그인 한다.

② 서버에서 정보를 검증한 후 정보가 일치한다면 서버에서 서명된(Signed) 토큰을 생성한다.

③ 생성한 토큰을 사용자에게 돌려준다.

④ 사용자 측에서 전달받은 토큰을 저장해둔다.

⑤ 서버에 요청할 때마다 해당 토큰을 서버에 함께 전달한다. 이 때 토큰을 HTTP Header에 첨부한다.

⑥ 서버에서 사용자로부터 온 토큰을 검증하고 요청에 응답한다.

※ 사용자가 로그아웃 하면 저장된 JWT 데이터를 제거한다.

 

 

2. JWT 구조

JWT는 헤더(Header), 내용(Payload), 서명(Signature)으로 이루어지며 각각의 부분을 이어주기 위해 . 구분자를 사용한다. 또한 Json 형태인 각 부분은 Base64로 인코딩 되어 표현된다. (Base64는 암호화된 문자열이 아니고 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.)

 

출처:JSON Web Tokens - jwt.io

 

2-1) 헤더(Header)

 

{
    "alg": "HS256",
    "typ": JWT
}

 

헤더는 algtyp 정보로 구성된다.

  • 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