JWT란

2024. 3. 21. 03:35·여러가지/이것저것

JWT(Json Web Token)는 인터넷 표준으로, 두 당사자 사이에서 JSON 객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안전하게 전송하기 위해 설계되었습니다. JWT는 주로 사용자 인증과 정보 교환에 사용됩니다. 자가수용적(self-contained)이라는 것은, 토큰 자체가 필요한 모든 정보를 포함하고 있어, 토큰을 받는 측에서는 추가적인 조회 없이도 해당 정보를 검증하고 사용할 수 있다는 의미입니다.

JWT는 세 부분으로 구성됩니다: Header, Payload, Signature.

 

Header: 토큰의 타입(주로 JWT)과 해싱 알고리즘(예: HMAC SHA256 또는 RSA)이 포함됩니다

 

Payload: 토큰에 포함될 클레임(claim) 정보가 포함됩니다. 클레임은 토큰에 대한 속성값으로, 사용자 인증 정보나 데이터 전송 등에 사용될 정보를 담습니다. 클레임에는 등록된 클레임, 공개 클레임, 비공개 클레임 세 종류가 있습니다.

  • 등록된 클레임: 서비스에서 필요한 정보가 아니라, 토큰에 대해 설명하는 정보입니다. 예를 들어, iss(발행자), exp(만료 시간), sub(주제) 등이 있습니다.
  • 공개 클레임: 충돌이 방지된 이름을 가진 클레임으로, 사용자 정의 정보를 포함할 수 있습니다.
  • 비공개 클레임: 두 당사자 사이에서 협의하에 사용되는 클레임으로, 사용자 정의 정보를 포함할 수 있습니다.

Signature: 서명 부분은 토큰의 무결성과 정보의 검증을 위해 사용됩니다. Header의 인코딩 값과 Payload의 인코딩 값을 합친 후, 제공된 비밀키로 해시하여 생성됩니다. 이 서명을 통해 토큰이 중간에 조작되지 않았는지 확인할 수 있습니다.

JWT는 HTTP 헤더에 Authorization으로 추가되거나 URL의 파라미터로 전송되어 사용됩니다. 이 토큰을 사용함으로써 서버는 각 요청마다 사용자의 세션을 저장할 필요 없이, 토큰만으로 사용자의 인증 상태를 확인할 수 있게 됩니다. 이는 상태를 유지하지 않는(stateless) RESTful 서비스에 매우 적합합니다.


Code example

JWT의 구현 예시를 들어보겠습니다. 여기서는 Python에서 JWT를 다루기 위해 널리 사용되는 PyJWT 라이브러리를 사용할 예정입니다. PyJWT를 사용하면 JWT를 생성하고, 검증할 수 있습니다.

먼저, PyJWT 라이브러리를 설치해야 합니다. 이를 위해 다음 명령어를 사용하세요:

pip install PyJWT

JWT 생성하기

JWT를 생성하기 위해, 먼저 토큰에 포함할 정보(claims)와 사용할 암호화 알고리즘, 그리고 비밀키를 정의해야 합니다. 다음은 간단한 JWT 생성 예시입니다:

import jwt
import datetime

# 비밀키 정의
secret_key = 'your_secret_key'

# 토큰에 포함할 정보(claims)
payload = {
    'sub': '1234567890',  # 주제 (subject)
    'name': 'John Doe',
    'admin': True,
    'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=600)  # 만료 시간 설정 (10분 후)
}

# JWT 생성
token = jwt.encode(payload, secret_key, algorithm='HS256')
print(token)

JWT 검증하기

JWT를 검증하는 과정에서는 해당 토큰이 유효한지, 만료되지 않았는지, 그리고 예상된 발행자로부터 발행되었는지 등을 확인합니다. 다음은 JWT를 검증하는 예시 코드입니다:

import jwt

# 비밀키 (토큰을 생성할 때 사용한 것과 동일한 키)
secret_key = 'your_secret_key'

# 받은 토큰
token = '여기에_받은_토큰_입력'

# JWT 검증 및 디코딩
try:
    decoded = jwt.decode(token, secret_key, algorithms=['HS256'])
    print(decoded)
except jwt.ExpiredSignatureError:
    print("토큰이 만료되었습니다.")
except jwt.InvalidTokenError:
    print("유효하지 않은 토큰입니다.")

이 코드들은 PyJWT 라이브러리를 이용하여 JWT를 생성하고, 검증하는 기본적인 방법을 보여줍니다. 실제 어플리케이션에 적용할 때는, 보안을 위해 secret_key를 안전하게 관리해야 하며, 필요에 따라 토큰의 claims을 조정하여 사용하세요.

저작자표시 (새창열림)

'여러가지 > 이것저것' 카테고리의 다른 글

OAuth와 JWT 차이  (2) 2024.03.21
OAuth1.0 과 OAuth2.0  (1) 2024.03.21
단방향 암호화  (0) 2024.03.21
비대칭키, 대칭키 암호화  (0) 2024.03.21
동기와 비동기  (0) 2024.03.18
'여러가지/이것저것' 카테고리의 다른 글
  • OAuth와 JWT 차이
  • OAuth1.0 과 OAuth2.0
  • 단방향 암호화
  • 비대칭키, 대칭키 암호화
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (283)
      • 여러가지 (108)
        • 알고리즘 & 자료구조 (73)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (39)
        • 파이썬 (31)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (0)
        • 암호화폐 (0)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    프로그래머스
    OOP
    mybatis
    spring
    DP
    EC2
    자바
    Spring WebFlux
    Redis
    Docker-compose
    항해99
    AWS
    RDS
    celery
    reactor
    Python
    ecs
    docker
    WebFlux
    시험
    java
    그리디
    취업리부트
    파이썬
    Spring Boot
    SAA
    완전탐색
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    백준
    FastAPI
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
JWT란
상단으로

티스토리툴바