JWT 동작 원리 가이드 (V3)

Tutorial Mode
각 단계별로 이동하는 설명을 따라가며 원리를 이해해보세요.
사용자 (Client)
Local Storage (JAVA Script 접근 가능)
만료된 토큰으로는
요청이 거부됩니다.
해커 (Hacker)
탈취한 토큰 저장소

해커는 통신을 엿들어
Access Token을 훔칩니다.

(Refresh Token은 주로
안전한 쿠키에 있어 훔치기 어렵습니다)

서버 (Auth & API)
Active Refresh Tokens (DB)
API Endpoint
200 OK
준비 완료. [로그인] 버튼을 눌러보세요.
아래로 스크롤하여 더 알아보기

JWT (JSON Web Token): 개념 및 원리 완벽 정리

1. 기본 개념: 놀이공원 자유이용권

JWT란 무엇인가?

왜 '손목 띠'인가요? (Session vs JWT)

구분 세션 (Session) 방식 JWT (Token) 방식
비유 회원 명부 손목 띠 (자유이용권)
작동 원리 직원이 입장할 때마다 장부(서버 DB)를 뒤져서 "이 사람 회원 맞나?" 확인합니다. 직원은 손님이 찬 손목 띠만 봅니다. 장부를 볼 필요가 없습니다.
장점 보안이 강력함 (서버가 통제) 서버 부하가 적음. (장부 확인할 필요 없음)
단점 사용자가 많아지면 장부 확인 줄이 길어짐 (서버 과부하) 손목 띠를 잃어버리면 누구나 쓸 수 있음 (탈취 위험)

2. JWT의 구조 (3단 케이크)

JWT는 점(.)으로 구분된 3덩어리의 문자열로 이루어져 있습니다.
aaaaaa.bbbbbb.cccccc

1) Header (헤더) - "빨간색 포장지"

2) Payload (페이로드) - "케이크(내용물)"

3) Signature (서명) - "봉인 씰(도장)"


3. 토큰은 왜 중요한가요? (Identity)

"토큰은 곧 '나' 자신입니다."

서버는 요청을 받을 때마다 "이게 누구지?"를 확인하지 않습니다.
대신 "이 토큰이 진짜인가?"만 확인합니다.

  1. 디지털 열쇠: 호텔 카드키와 같습니다. 카드키를 주운 사람은 누구든 내 방에 들어갈 수 있습니다. 서버는 카드키를 든 사람이 '진짜 주인'인지 '도둑'인지 구별하지 못합니다.
  2. 권한의 증표: 이 토큰 하나로 '내 사진 삭제', '결제', '비밀번호 변경' 등 나로서 할 수 있는 모든 권한이 생깁니다.
  3. 결론: 토큰을 잃어버리는 것은 내 신분증과 집 열쇠, 지갑을 통째로 넘겨주는 것과 같습니다. 그래서 "어디에 안전하게 보관할 것인가"가 가장 중요한 이슈가 됩니다.

3. JWT는 어떻게 믿을 수 있나요? (무결성)

시나리오: 해커의 조작 시도

  1. 발급: 서버가 철수에게 "철수는 일반 유저임"이라고 쓴 JWT를 발급해줍니다. 서명은 (내용+비밀키)로 만들어졌습니다.
  2. 조작: 해커가 중간에 토큰을 가로채서 "철수는 관리자(Admin)임"이라고 Payload를 고칩니다.
  3. 전송: 해커가 조작된 토큰을 서버에 보냅니다.
  4. 검증 (서버의 방어):
    • 서버는 토큰을 받자마자 서명(Signature)을 다시 계산해봅니다.
    • 받은 내용("관리자") + 비밀키 = 새로운 서명 B
    • 하지만 토큰에 붙어있는 건 원래 서명 A입니다.
    • 불일치!: 서버는 "이 녀석, 내용물을 건드렸구나!"라고 바로 알아채고 요청을 거부합니다.
핵심: 해커는 내용은 고칠 수 있어도, 서버의 비밀키를 모르기 때문에 그에 맞는 유효한 서명을 새로 만들어낼 수 없습니다.

4. 자주 묻는 질문 (FAQ) & 보안 시나리오

Q. "JWT를 해킹한다"는 게 무슨 뜻인가요?

해킹에는 크게 두 가지 종류가 있습니다.

1) 위변조 (Tampering) - "내용 고치기"

2) 탈취 (Theft) - "훔쳐서 그대로 쓰기"


5. 저장소 전략: 어디에 숨겨야 안전할까? (Storage)

토큰을 클라이언트(브라우저)의 어디에 저장하느냐는 보안의 핵심입니다.

1) LocalStorage (로컬 스토리지)

2) HttpOnly Cookie (쿠키)

3) 최적의 조합 (Best Practice)

종류 저장 위치 이유
Access Token 메모리(변수) or LocalStorage API 통신에 자주 써야 하므로 접근이 쉬운 곳에 둡니다. (탈취돼도 수명이 짧아 괜찮음)
Refresh Token HttpOnly Cookie 자바스크립트 접근을 원천 차단하여, 해커가 훔쳐갈 수 없게 만듭니다.
요약: "자주 쓰는 건(AT) 주머니에, 정말 중요한 건(RT) 은행 금고(HttpOnly Cookie)에."

6. Refresh Token (리프레시 토큰) 전략

"짧은 수명의 출입증과 긴 수명의 재발급권"

기본 구조

로그인 시 서버는 두 개의 토큰을 줍니다.

  1. Access Token (액세스 토큰):
    • 용도: 실제 출입증 (API 요청용).
    • 수명: 아주 짧음 (예: 30분).
    • 특징: 탈취당해도 금방 만료되니 피해가 최소화됩니다.
  2. Refresh Token (리프레시 토큰):
    • 용도: "액세스 토큰이 만료되면 새거 주세요" 할 때 쓰는 재발급권.
    • 수명: 아주 김 (예: 2주).
    • 특징: 평소에는 금고(DB)나 안전한 곳(HttpOnly Cookie)에 두고 잘 안 꺼냅니다.

작동 흐름 (시나리오)

  1. 로그인: 유저가 Access Token(30분) + Refresh Token(2주)을 받습니다.
  2. 사용: 유저는 Access Token만 보여주고 신나게 놉니다.
  3. 만료: 30분 뒤, 입구에서 "손님, 이 출입증 기한 지났는데요?"(401 Error) 하고 막습니다.
  4. 갱신 (Silent Refresh):
    • 유저(브라우저)는 당황하지 않고, 가방 깊숙한 곳에서 Refresh Token을 꺼내 서버에 보냅니다. "재발급권 여기요."
    • 서버는 "재발급권 맞네. 자, 새로운 Access Token(30분짜리) 줄게." 합니다.
  5. 지속: 유저는 다시 로그인할 필요 없이 계속 서비스를 이용합니다.

왜 이렇게 하나요?


5. 결론: 언제 써야 할까?