본문 바로가기

개발/Data

[Data] JWT란?

반응형

소개

"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 식별자) 등이 있습니다.

를 교환하는 데 사용됩니다.

 

 

 

디버깅 사이트 

https://jwt.io/

 

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를 사용할 때 주의할 점도 있습니다. 예를 들어, 토큰을 안전하게 보관해야 하며, 특히 비밀 키를 안전하게 관리해야 합니다. 특별한 상황에 따라 다른 인증 방식이나 토큰 종류를 사용해야 할 수도 있습니다.

반응형