[인 더 정글] JWT, 이것만 알고 가기

2025. 3. 14. 15:11·크래프톤 정글/CS기초(키워드, 개념정리)

JWT, 전체적인 개념과 특징 알아보기

JWT(JSON Web Token)는 인증과 인가를 위한 토큰 형태의 도구입니다. 사용자가 가입된 서비스 사용자인지 확인하고, 특정 기능을 사용할 권한이 있는지를 판단하기 위해 사용됩니다.

 

즉 JWT는 마치 회사의 회원증과 같다고 볼 수 있는데요. 그래서 회사 직원들이 출입할 때 회원증을 태그하는 것처럼 사용자가 인증된 사람인지 확인하는 역할을 하고, 임직원 전용 구역에 일반 사원 회원증으로는 들어갈 수 없는 것처럼 사용자의 권한을 판별해 특정 기능을 사용할 수 있도록 인가하는 역할도 담당합니다.

 

또한 JWT는 토큰 자체에 인증 정보가 포함되어 있기 때문에, 세션 기반 인증처럼 서버가 로그인된 사용자의 상태를 계속 유지할 필요가 없습니다. 이로 인해 서버의 부하가 줄어들고, 여러 서버에서 토큰을 검증할 수 있어 마이크로 서비스 같은 분산 시스템에서도 유용합니다.

 

그리고 JWT의 일부에는 사용자 정보를 포함할 수 있어 서버에서 이를 활용해 별도의 DB 조회 없이 사용자 정보를 빠르게 확인할 수도 있습니다.

 

다만, 토큰이 탈취될 경우에는 보안 문제가 발생할 수 있으므로, 이를 방지하기 위한 대책이 필요한데요. 예를 들어, HTTPS를 사용하거나, 토큰의 만료 시간을 설정하고, Refresh Token을 활용하는 방법 등이 있습니다.

 

 

JWT 구조 파악하기

JWT는 크게 헤더(Header), 페이로드(Payload), 서명(Signature) 세 가지 부분으로 구성되어 있는데요. 각 부분은 Base64 URL이라는 형식으로 인코딩된 문자열 형태이고 . (마침표)로 구분됩니다.

# JWT 예시
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. #헤더 영역
eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwicm9sZSI6InVzZXIiLCJleHAiOjE2OTk5OTk5OTl9. #페이로드 영역
s6xYB5-2zW1mX2n6rF3vIx9MRXHqG2Ro2e7QzBhJ_s4 #서명 영역

헤더(Header)

먼저 암호화에 어떤 알고리즘을 사용할지와 토큰의 타입을 지정하는 부분을 헤더(Header)라고 합니다. 이때 당연하게도 토큰 타입은 "JWT"이 됩니다.

# 헤더 예시
{
  "alg": "HS256",
  "typ": "JWT"
}

# Base64 URL로 인코딩 후 맨 위 JWt 예시의 헤더로 변환
# eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

 

페이로드(Payload)

이어서 실제 데이터를 포함하는 부분을 페이로드(Payload)라고 하는데요. 이때 하나의 키-값 쌍을 클레임(Claim)이라고 합니다. 여기에는 사용자의 민감하지 않으면서 고유한 정보, 권한, 토큰 만료 시간, 토큰 발급 시간, 토큰 소유자 등의 정보가 포함될 수 있습니다.

# 페이로드 예시
{
  "userId": "1234567890",
  "role": "user",
  "exp": 1699999999
}

# Base64 URL로 인코딩 후 맨 위 JWt 예시의 페이로드로 변환
# eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwicm9sZSI6InVzZXIiLCJleHAiOjE2OTk5OTk5OTl9

서명(Signature)

마지막으로 JWT의 무결성을 보장하는 부분을 서명(Signature)라고 합니다. 서명은 헤더와 페이로드의 인코딩 값을 결합한 후, 서비스 제공자가 미리 정의한 비밀키를 사용해 해시를 생성하여 만들어지는데요.

 

쉽게 말해 여러 재료(헤더, 페이로드, 비밀키)들을 믹서기에 넣고 갈아서 나온 결과물이라고 볼 수 있습니다. 같은 재료를 사용하게 되면 같은 결과물이 나오게 되겠지만 재료 중 하나라도 달라지게 된다면 전혀 다른 결과물이 생성됩니다. 그래서 이를 통해 서버가 위/변조되지 않고 유효한 토큰인지를 판단할 수 있습니다.

# 서명 예시
HMACSHA256(
    base64UrlEncode(header) + "." + base64UrlEncode(payload),
    secret-key
)

# Base64 URL로 인코딩 후 맨 위 JWt 예시의 서명으로 변환
# s6xYB5-2zW1mX2n6rF3vIx9MRXHqG2Ro2e7QzBhJ_s4

 

 

JWT 인증 흐름 알아보기

JWT가 발급되어 이용되는 전체적인 흐름은 다음과 같습니다.

  1. 먼저 사용자가 아이디와 비밀번호를 입력하여 서버에 로그인 요청을 보냅니다.
  2. 서버는 사용자 정보를 검증한 후, 올바른 사용자라면 JWT 토큰을 발급합니다.
    • 이때, JWT에 필요한 사용자 정보를 임의로 추가할 수 있습니다.
  3. 사용자는 발급받은 JWT를 원하는 장소(localStorage, SessionStorage, Cookie)에 저장합니다.
  4. 이후 가입된 서비스 이용 권한이 필요한 기능에 접근할 때, 저장된 JWT를 함께 전송합니다.
  5. 서버가 전달받은 JWT 토큰의 서명을 검증하여 유효한 토큰인 경우 요청을 처리합니다.

 

마치면서

JWT가 도대체 무엇인지, 어떻게 이루어졌는지 그리고 어떤 흐름으로 작동하는지를 알아보았는데요. 이를 알고 활용 방법 학습에 들어간다면 훨씬 잘 이해할 수 있으리라 생각합니다.

 

다만 JWT는 개발 프레임워크에 따라 활용 방법이 달라지기 때문에. 본인이 현재 개발에 사용하고 있는 프레임워크에서 JWT를 사용하는 방법을 찾아 학습해야 합니다. 그러면 여기서 마치겠습니다. 감사합니다!

저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > CS기초(키워드, 개념정리)' 카테고리의 다른 글

[CS기초] 알고리즘 복잡도(Big-O Notation)  (0) 2025.03.19
[CS기초] 반복문(Loop), 재귀 함수(Recursion Function)  (0) 2025.03.19
[CS기초] 배열(Array), 문자열(String)  (0) 2025.03.19
[CS기초] 32비트 vs 64비트 차이점  (0) 2025.03.18
[인 더 정글] Jinja2, 이것만 알고 가기  (0) 2025.03.13
'크래프톤 정글/CS기초(키워드, 개념정리)' 카테고리의 다른 글
  • [CS기초] 반복문(Loop), 재귀 함수(Recursion Function)
  • [CS기초] 배열(Array), 문자열(String)
  • [CS기초] 32비트 vs 64비트 차이점
  • [인 더 정글] Jinja2, 이것만 알고 가기
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리) N
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어) N
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[인 더 정글] JWT, 이것만 알고 가기
상단으로

티스토리툴바