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를 만들어준다.