Post

JSON Web Token

JSON Web Token

JSON Web Token

JWT(Json Web Token)은 Json 객체에 인증에 필요한 정보들을 담은 후 비밀키로 서명한 토큰으로, 인터넷 표준 인증 방식이다. 공식적으로 인증(Authentication) & 권한허가(Authorization) 방식으로 사용된다.

로그인 전 (JWT를 발급받기)

  1. 사용자가 아이디와 비밀번호 혹은 소셜 로그인을 이용하여 서버에 로그인 요청을 보낸다.
  2. 서버는 비밀키를 사용해 json 객체를 암호화한 JWT 토큰을 발급한다.
  3. JWT를 헤더에 담아 클라이언트에 보낸다.

로그인 이후

  1. 클라이언트는 JWT를 로컬에 저장해놓는다.
  2. API 호출을 할 때마다 header에 JWT를 실어 보낸다.
  3. 서버는 헤더를 매번 확인하여 사용자가 신뢰할만한지 체크하고, 인증이 되면 API에 대한 응답을 보낸다.

JWT 구조

Header

  • alg : 서명(Signature)에서 사용하는 알고리즘( RS256 공개키/개인키 or HS256 비밀키)
  • typ : 토큰 타입

Payload

사용자 정보의 한 조각인 클레임(claim)이 들어있다. 토큰 정보

  • sub : 토큰 제목(subject)
  • aud : 토큰 대상자(audience)
  • iat : 토큰이 발급된 시각 (issued at)
  • exp : 토큰의 만료 시각 (expired)

Header와 Payload는 단순히 Base64url로 인코딩되어 있어 누구나 쉽게 복호화할 수 있다.

Signature

  • Header+Payload : 서명 (인증용) 헤더와 페이로드의 문자열을 합친 후 헤더에서 선언한 알고리즘과 key를 이용해 암호한 값 Signature는 key가 없으면 복호화할 수 없다. 보안상 안전하다.

HTTP의 특성

Connectionless : 한 번 통신이 이뤄지고 난 후에 연결이 바로 끊어진다

Stateless : 이전 상태를 유지/기억하지 않는다

HTTP는 한 번 통신이 일어나고 나면 연결이 끊어지고, 다시 연결해도 이전 상태를 유지하지 않아 과거에 어떤 정보를 보냈었는지 기억하지 못한다. 즉, 화면을 이동하며 새로운 API를 요청하면 다시 신뢰할만한 사용자인지 인증하는 과정을 거쳐야하는 것이다.

인증된 사용자가 어느 정도 기간동안 재인증 하지 않아도 되도록(로그인이 유지되도록) 만든 것이 Access Token이다.

This post is licensed under CC BY 4.0 by the author.