Search

JWT

대분류
CS
소분류
World Wide Web
설명
일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰
유형
인증/인가
주요 레퍼런스
https://blog.bizspring.co.kr/%ED%85%8C%ED%81%AC/jwt-json-web-token-%EA%B5%AC%EC%A1%B0-%EC%82%AC%EC%9A%A9/
https://puleugo.tistory.com/138
최종 편집 일시
2024/10/27 15:30
생성 일시
2024/07/22 06:32
13 more properties

JWT란?

설명

일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰
웹 상에서 정보를 Json형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 string 형태로 저장

구성

헤더: 토큰 타입, 암호화 알고리즘 명시
페이로드: JWT에 넣을 데이터, JWT 발급 / 만료일 등 명시
시그니처: 헤더, 페이로드가 변조 되었는지를 확인하는 역할

Header(헤더)

서명 시 사용하는 키(kid), 사용할 타입(typ), 서명 암호화 알고리즘(alg)의 정보를 보유
{ "kid": "Key ID", "typ": "JWT", "alg": "ES256" }
Python
복사
kid : 서명 시 사용하는 키(Public/Private Key)를 식별하는 값
typ : 토큰 유형
alg : 서명 암호화 알고리즘 HS256(HMAC SHA-256), HS512, RS256(RSASSA SHA-256), ES256(ECDSA P-256 curve SHA-256)

Payload(페이로드)

정보
전달하려는 정보(클레임: 사용자 id나 다른 데이터들)가 들어있다.
노출과 수정이 가능한 지점
⇒ 인증이 필요한 최소한의 정보(아이디, 비밀번호 등 개인정보가 아닌 이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)만을 담아야 한다.
{ "iss": "growthplatform", "sub": "jwtlearning", "iat": 1702189795, "exp": 1702193395, "roles": "ROLE_SUPER", }
Python
복사
iss : 토큰 발급자(issuer) – Public Claims
sub : 토큰 제목(subject) – Public Claims
iat : 토큰 발급 시간(issued at) – Public Claims
exp : 토큰 만료 시간(expiration) – Public Claims
roles : 권한 – Private Cliams

Signature(서명)

가장 중요한 부분
헤더와 정보를 합친 후 발급해준 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만든다.
⇒ Header(헤더)+ 페이로드(Payload)와 서버가 갖고 있는 유일한 key 값을 합친 것을 헤더에서 정의한 알고리즘으로 암호화
Header(헤더) 와 페이로드(Payload)는 단순히 인코딩된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature(서명)는 서버 측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없다. ⇒ 토큰의 위변조 여부 확인

토큰 vs 세션

플로우 비교
토큰 방식
토큰이 보안, 유저 데이터를 관리
세션 방식
서버에 보안, 유저 데이터를 관리
토큰을 사용하는 세션 기반 인증방식 : 메모리/DB에 저장해두고 거기서만 지워버린다.

엑세스 토큰/리프레시 토큰

엑세스 토큰: 서버 API를 직접 요청할 때 사용한다.
리프레시 토큰: 엑세스 토큰이 만료되었을 때 엑세스 토큰을 재발급할 목적으로 사용한다.
직접 API를 호출하는엑세스 토큰의 주기는 짧게하고, (약 1시간)
엑세스 토큰을 재발급하는리프레시 토큰의 주기는 비교적 길게한다. (약 2주)
백엔드에서는 엑세스 토큰 갱식 API를 만들어준다.