소개
"JSON Web Token"의 약자로, 웹에서 정보를 안전하게 전송하기 위한 토큰 기반의 인증 방식 중 하나입니다. JWT는 클레임(claim) 기반의 토큰으로, 정보를 JSON 객체로 표현하고 이를 서명하여 생성됩니다.
JWT 내용
Header(헤더):
JWT의 유형 및 사용되는 알고리즘 등의 메타데이터를 포함합니다. 이 부분은 Base64로 인코딩되어 있습니다.
Payload(페이로드):
실제로 전송되는 데이터, 즉 클레임(claim)이 저장된 부분입니다. 클레임은 사실상 토큰에 담기는 정보를 나타냅니다. 클레임은 등록된 클레임, 공개 클레임, 비공개 클레임으로 나누어집니다.
- 공개 클레임(Public Claims): 사용자 정의 클레임으로, 충돌을 피하기 위해 URI 형식으로 정의되어야 합니다.
- 비공개 클레임(Private Claims): 클라이언트와 서버 간에 협의된 클레임으로, 서버와 클라이언트 사이의 사용자 지정 정보
Signature(서명):
헤더와 페이로드를 조합한 후, 비밀 키를 사용하여 서명되어 있습니다. 이 서명은 토큰이 변경되지 않았음을 증명하고, 해당 서명을 통해 토큰의 신뢰성이 보장됩니다.
등록된 클레임(Registered Claims):
토큰에 대한 정보를 제공하기 위해 미리 정의된 클레임으로, iss(발급자), sub(주체), aud(대상자), exp(만료 시간), nbf(Not Before), iat(발급 시간), jti(JWT 식별자) 등이 있습니다.
를 교환하는 데 사용됩니다.
디버깅 사이트
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
예제 내용
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Header: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload: eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature: SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
사용 이유
간편한 표현 및 전송:
JWT는 JSON 형식을 사용하므로 데이터를 간편하게 표현할 수 있습니다.
문자열 형태로 표현되며, HTTP 헤더나 URL 파라미터 등에 손쉽게 포함시킬 수 있습니다.
클레임 기반 (Claim-Based):
JWT는 클레임이라는 이름-값 쌍의 페이로드를 포함합니다. 이 클레임은 사용자에 대한 정보나 기타 메타데이터를 포함할 수 있습니다.
인증 및 권한 부여:
사용자 인증을 처리하고, 특정 리소스에 대한 접근 권한을 부여하는 데 사용됩니다.
토큰에는 사용자 ID, 역할, 만료 시간 등을 담을 수 있어서 인증 및 권한 부여를 효과적으로 관리할 수 있습니다.
분산 환경에서 사용 용이:
JWT는 서버 간 통신에서 사용하기에 적합하며, 여러 서비스 간에 사용자 인증 및 권한을 쉽게 전파할 수 있습니다.
토큰은 서명되어 있어 무결성을 검증할 수 있고, 서명에 사용된 비밀 키만 알고 있다면 토큰의 신원을 확인할 수 있습니다.
상태를 갖지 않음 (Stateless):
서버에서 상태를 저장하지 않고, 토큰을 이용하여 클라이언트와 서버 간의 상태를 관리할 수 있습니다.
이는 서버의 확장성을 향상시키고, 서버 간의 상태 공유를 필요로 하지 않게 합니다.
소셜 로그인 및 단일 로그인 (SSO):
여러 서비스 간에 통합된 로그인을 구현할 때 JWT가 유용합니다. 사용자가 한 번 로그인하면 해당 토큰을 다른 서비스에서도 인증 용도로 사용할 수 있습니다.
보안 향상:
JWT는 서명을 통해 토큰의 무결성을 검증하고, 필요에 따라 암호화하여 정보를 안전하게 전송할 수 있습니다.
표준화된 형식으로 구현되어 있어 많은 개발자와 프레임워크에서 지원하고 있습니다.
결론
JWT는 주로 웹 애플리케이션에서 사용되며, 사용자 인증 및 정보 교환 등의 목적으로 활용됩니다. 예를 들어, 사용자가 로그인한 후 서버가 사용자에게 JWT를 발급하고, 이후의 요청에서는 이 JWT를 포함하여 서버에 인증을 요청할 수 있습니다.
주의사항
그러나 JWT를 사용할 때 주의할 점도 있습니다. 예를 들어, 토큰을 안전하게 보관해야 하며, 특히 비밀 키를 안전하게 관리해야 합니다. 특별한 상황에 따라 다른 인증 방식이나 토큰 종류를 사용해야 할 수도 있습니다.