r잡초처럼
바른 프로그래밍
r잡초처럼
전체 방문자
오늘
어제
  • 분류 전체보기 (124)
    • FastAPI (7)
    • 끄적끄적 (2)
    • Python (17)
    • Django (31)
    • Database (2)
    • Docker (7)
    • 디자인패턴 (2)
    • CS 공부 (12)
      • 알고리즘 (2)
      • 자료 구조 (1)
      • 네트워크 (7)
      • IT 지식 (1)
      • 운영체제 (1)
    • 기타 팁들 (10)
    • Aws (2)
    • 독서 (1)
    • 코딩테스트 공부 (1)
      • 백준 (0)
      • 프로그래머스 (1)
    • DevOps (13)
    • TIL (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 케이블의 종류
  • Batch
  • 전기 신호
  • CS 지식
  • 네트워크
  • dotenv
  • cp949
  • encoding
  • query param
  • 컴퓨터 기본 지식
  • 모두의 네트워크
  • depends
  • 상속 안티 패턴
  • 6장
  • 완벽한 IT 인프라 구축을 위한 Docker
  • 상속과 컴포지션
  • fastapi
  • 랜과 왠
  • 파이썬 클린 코드
  • pytest
  • 랜 카드
  • 7장
  • validate
  • pycharm
  • preonboarding
  • 5장 회사에서 하는 랜 구성
  • poetry
  • docker
  • 책 리뷰
  • 물리 계층

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
r잡초처럼

바른 프로그래밍

Django

[Django] - 사용자 로그인 - JWT 적용하기 - 2. JWT 이해하기

2023. 7. 3. 22:43

2023.07.02 - [Django] - 사용자 로그인 - JWT 적용하기 - 1. Session 이해하기

JWT (Json Web Token) 이란?

JWT는 JSON Web Token의 약자로, 웹 표준으로 지정된 토큰 기반의 인증 방식이다. JWT는 사용자의 정보를 JSON 객체로 안전하게 전송하기 위한 방법으로, 특히 분산 시스템에서 인증 정보를 공유할 때 유용하다.

JWT의 구성

JWT는 세 부분으로 구성되어 있다.

Header

JWT의 헤더(Header)는 JWT의 유형과 암호화 알고리즘 정보를 포함하는 부분입니다. 헤더는 Base64로 인코딩 된 JSON 객체로 구성되어 있다.

헤더는 다음과 같은 두 가지 주요 속성을 포함한다.

  • 토큰 유형(Type): 토큰의 유형을 나타내는 속성이다. 일반적으로 JWT 토큰은 "JWT"로 지정된다. 이 속성은 다른 유형의 토큰을 나타내기 위해 확장될 수 있다.
  • 암호화 알고리즘(Algorithm): 토큰의 서명 및 검증에 사용되는 암호화 알고리즘을 지정하는 속성이다. JWT는 다양한 암호화 알고리즘을 지원하며, 일반적으로 HMAC SHA256 또는 RSA를 사용한다. 이 속성은 "HS256" 또는 "RS256"와 같은 알고리즘 식별자로 표시된다.
  • { "alg": "HS256", "typ": "JWT" }
  • 헤더는 토큰의 유효성을 검증하는 데 사용된다. 토큰을 수신한 서버나 클라이언트는 헤더에서 지정된 암호화 알고리즘을 사용하여 토큰의 서명을 검증한다. 이를 통해 토큰이 변조되지 않았음을 확인할 수 있다.
  • 헤더의 정보는 Base64로 인코딩되어 페이로드와 함께 토큰의 일부로 전송된다. 토큰을 해독할 때는 Base64 디코딩을 통해 헤더의 원래 JSON 객체를 얻을 수 있다.
  • Header는 Base64로 인코딩되어 JWT의 첫 번째 세그먼트로 들어간다.

Payload

JWT의 Payload는 사용자 정보와 추가적인 메타데이터를 포함한다. Payload는 Base64로 인코딩 되어 JWT의 두 번째 세그먼트로 들어간다.
Payload는 세 가지 부분으로 구성되어 있다.

  • Registered claims : JWT에서 미리 정의된 정보이다. 예를 들어, `iss`(Issuer), `exp`(Expiration Time), `sub`(Subject) 등이 있다.
    • "iss" (Issuer): 토큰을 발급한 발급자를 나타낸다.
    • "sub" (Subject): 토큰의 주제(대상)를 나타냅니다. 일반적으로 사용자 ID와 같은 식별자가 될 수 있다.
    • "aud" (Audience): 토큰의 대상(수신자)을 나타낸다.
    • "exp" (Expiration Time): 토큰의 만료 시간을 나타낸다.
    • "nbf" (Not Before): 토큰의 사용 가능한 시작 시간을 나타낸다.
    • "iat" (Issued At): 토큰이 발급된 시간을 나타낸다.
    • "jti" (JWT ID): JWT의 고유 식별자를 나타낸다.
  • Public claims : 사용자가 임의로 지정할 수 있는 정보이다. 공개 클레임은 충돌을 피하기 위해 네임스페이스 접두사를 사용하는 것이 권장된다. 예를 들면, "user_id", "email", "role" 등의 사용자 지정 클레임을 포함할 수 있다.
  • Private claims : 사용자가 임의로 지정할 수 있는 정보 중, 충돌이 발생하지 않도록 등록된 정보이다. 이 클레임은 서버와 클라이언트 간의 사전 협의에 따라 사용된다. 특정 애플리케이션 또는 도메인에 특화된 데이터를 포함할 수 있다.

Signature

JWT의 Signature는 Header와 Payload를 서명한다. 서명하는 방법은 Header에서 지정한 알고리즘에 따라 달라진다. 서명된 Signature는 Base64로 인코딩 되어 JWT의 세 번째 세그먼트로 들어간다.

JWT의 장단점

장점

  • Stateless : 서버에서 세션을 유지할 필요가 없기 때문에 서버 자원을 아낄 수 있다.
  • 분산 시스템에서 유용 : JWT는 분산 시스템에서 인증 정보를 공유하기 위한 안전한 방법을 제공한다.
  • 안전성 : JWT는 서명이 되어 있기 때문에 데이터가 변조되었는지 여부를 확인할 수 있다.

단점

  • Payload가 노출될 위험이 있음 : JWT는 Base64로 인코딩되어 있기 때문에, Payload가 노출될 위험이 있다. 따라서, 중요한 정보는 반드시 암호화되어야 한다.
  • 만료 시간 처리 : 만료 시간이 지난 JWT는 더 이상 유효하지 않다. 따라서, 클라이언트가 새로운 토큰을 요청해야 한다.

'Django' 카테고리의 다른 글

Swagger - SerializerMethodField의 return type hint  (0) 2023.07.04
사용자 로그인 - JWT 적용하기 - 1. Session 이해하기  (0) 2023.07.02
인증 구현하기  (0) 2023.05.14
Django Channels - 채팅 기능 구현하기 - 1  (0) 2023.05.08
Django Channels - Consumer 살펴보기  (0) 2023.05.05
    'Django' 카테고리의 다른 글
    • Swagger - SerializerMethodField의 return type hint
    • 사용자 로그인 - JWT 적용하기 - 1. Session 이해하기
    • 인증 구현하기
    • Django Channels - 채팅 기능 구현하기 - 1
    r잡초처럼
    r잡초처럼
    오늘보다 내일 더 나은 개발자가 되기 위한 노력을 기록하는 블로그 입니다.

    티스토리툴바