JWT 의 목적과 개념

corgiLoaf·2023년 6월 23일
0

서비스를 구현할 때 빠질 수 없는 요소 중 하나는 Authorization, 인증 기능이다.
이때 사용하는 JWT와 Access Token, Refresh Token 에 대한 개념을 간단히 정리해보자
🔗: jwt.io

JWT

JWT (JSON Web Token) 는 RFC 7519 웹 표준을 따르고 있으며, 이름에서 보여지듯 JSON 객체로 구성되어 있다.
여러 곳에 사용할 수 있지만 주로 인증 및 권한 부여 등에 사용된다.
비교적 단순하고 스스로에 대한 정보를 포함하고 있어(self-contained) 널리 쓰이고 있으며, JSON 객체로 보안이 필요한 정보를 주고 받을 수 있다.

언제 JWT를 사용하는가?

  • 인증 (Authorization) : JWT의 가장 주된 사용처이다. 사용자가 로그인한 후에 이루어지는 요청들에는 발급된 JWT를 포함하여 보내게 되고, 사용자가 서비스에 접근할 수 있게 된다.
  • 정보 교환 (Information Exchange) : JWT를 사용하면 안전하게 정보를 주고 받을 수 있다. 공개키-비밀키 쌍을 이용해 암호화를 할 경우, 서명의 용도로도 사용이 가능하므로 보낸 사람이 누군지 확인 할 수 있다.

JWT 의 구조


JWT는 xxx.yyy.zzz 와 같은 형식으로 이루어져있다. 차례대로 헤더, 페이로드, 서명 파트이다.

  • 헤더 (Header):
    헤더는 토큰의 타입을 나타내는 typ 과 서명 알고리즘을 나타내는 alg 필드로 이루어져 있다. JSON 형식으로 인코딩되고, Base64로 인코딩된 문자열이다.
{
  "alg": "HS256",
  "typ": "JWT"
}
  • 페이로드 (Payload): 토큰에 포함되는 클레임(claim) 정보를 담는다. 클레임은 실제로 토큰이 전달하고자 하는 데이터 정보로, 사용자가 원하는 key-value 쌍으로 이루어져 있다.
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

⚠️ 페이로드에는 비밀번호와 같이 보안이 필요한 정보를 담으면 안된다. 암호화 하여 전달하는 것이 아니라 단순 디코딩 후 전달하기 때문!

  • 서명 (Signature) : 서명은 헤더와 페이로드의 무결성을 보장하기 위해 사용한다. 서명은 헤더와 페이로드, 그리고 비밀 키(secret key)를 사용하여 생성한다. 토큰의 변조를 방지하고, 토큰의 신뢰성을 검증하기 위해 사용한다. 헤더에 지정된 서명 알고리즘에 따라 생성하며 (HMAC, RSA 등) 토큰을 발급할 때는 비밀키를 지정해줘야한다.
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  {secretKey} 
)

JWT의 보안 방식

헤더에 어떤 종류의 알고리즘을 사용하여 암호화하는지 명시한다.
HMAC 과 같은 해싱 secret key 알고리즘을 통해 암호화할 수도 있고, RSA 와 같은 공개키 알고리즘을 사용하기도 한다.

profile
삽질하고 기록하기

0개의 댓글