0.
JWT는 API에서 가장 많이 쓰이는 Authorization 프로토콜이다.
JSON Web Token은 JSON 객체를 사용하는 두 파티간에
안전하게 데이터를 송수신하는 방식이다.
각 JWT는 디지털 서명Digitally Signed되어
서버는 수신받은 토큰이 손상되었는지 곧바로 알 수 있으며
Authorization(권한허가) 및 서버-클라이언트 데이터송수신에 특화되어있다.
유저가 로그인을 하면, 서버는 Json Web Token을 유저에게 리턴해주고,
유저가 이 토큰을 이용해서 서버에 각각의 Request에 JWT를 첨부해서 보내면
서버가 JWT를 보고 허가받은 작업을 Response해주는 방식이다.
1.
JWT는 세가지 영역으로 구분되어 있으며, 각 영역은 점'.' 으로 구분된다.
(Header) . (Payload) . (Signature) 세 부분으로 연결된다.
2.
JWT Header는
두 부분으로 나뉜다.
{
"alg":"HS256",
"typ":JWT
}
Signing Algorithm과 Type of Token이다.
위와 같이 Signing Algorithm과 토큰타입을 명시한 후
Base64의 방식으로 인코딩되어 JWT의 Header파트를 이루게 된다.
3.
JWT Payload는 JWT의 두번째 영역을 이룬다.
Payload영역은 실제로 전달되는 데이터들이 담기게 되는데
이곳에서는 세가지 타입의 클레임Claim이 존재한다.
(번역하자면 부탁,요청?인데 Req랑 겹쳐서 그냥 클레임이라고 부르자)
Registered, Public, Private 클레임이다.
{
"sub" : "112233",
"name" : "John Doe",
"given_name" : "John",
"family_name" : "Doe",
"email" : "johnd00@gmail.com"
"admin" : true
}
(1)
레지스터 클레임은, 미리 정의된 클레임이다.
해당 클레임은 JWT Payload에 담겨있는 것을 추천하지만, 꼭 담겨있지 않아도 된다.
Register Claim에는 iss(이슈어), sub(서브젝트), exp(만료시간)이 있다.
iss이슈어는 JWT을 발급하는 발행자, 해당 JWT를 발급한 주체를 의미하며
우리의 경우는 백엔드 서버가 이슈어가 된다.
Sub서브젝트는 해당 JWT를 발급받아 신원인증의 대상이 되는 존재로
이 경우에는 서버나 API를 사용하려는 유저가 된다.
Exp, Expiration Time은 발급받은 JWT가 만료되는 시간을 의미한다.
만료시간은 필수는 아니지만, 특정 기간이 지나면 자동으로 만료되는 기능이 상당히 유용하다.
한 컴퓨터에서 로그아웃하지 않고 계속 해당 JWT로 접근가능하면 보안적으로 문제가 생기기 마련이다.
이러한 정보를 담은 JWT Payload역시 Base64로 인코딩되어
JWT의 두번째 부분을 나타내게 된다.
(2) Public Claim
Public Claim은 공개적으로 정의된 클레임으로, 사용자와 관련된 정보를 나타낸다.
예를 들어, 이름(name), 이메일(email) 등과 같은 정보가 이에 해당한다.
Public Claim은 충돌을 방지하기 위해
IANA JSON Web Token Registry에 등록된 URI 형식으로 사용해야 합니다.
(3) Private Claim
Private Claim은 특정 애플리케이션이나 서비스 간의 데이터 전송을 위해 정의된 클레임이다.
서버와 클라이언트 간에 비공개로 정의되며, 공통적으로 사용하는 값이 아니다.
예를 들어, 사용자 역할(예: admin)이나 특정 비즈니스 로직에 필요한 값이 여기에 해당된다.
4.
JWT Signature는 JWT의 세번째 부분에 해당한다.
Header에 명시된 알고리즘을 사용하여
payload와 secret을 조합하여 인코딩한다.
이를 통해 데이터의 무결성과 인증을 보장한다.
HMACSHA256(
base64UrlEncode(header) + "."
base64UrlEncode(payload),
secret
)
Secret은 서버에 저장되어 Client가 접근하지 못하는
서버만 알아볼 수 있는 정보이다.
이러한 정보들이 base64로 인코딩되어 Signature Part에 저장된다.
5.
주의사항
민감한 정보 금지: JWT Payload는 암호화되지 않으므로,
민감한 정보(예: 비밀번호, 카드 정보 등)는 포함하지 않아야 합니다.
JWT 만료 시간 설정: exp 필드를 설정해 만료 시간을 지정함으로써 보안을 강화할 수 있습니다.
Secret 관리: Secret은 절대 외부에 노출되지 않도록 철저히 관리해야 하며,
주기적으로 갱신하는 것이 좋습니다.
6.
Base64는 암호화(Encrpyt) Method가 아니라
Encoding Method이다.
누구나 쉽게 Base64로 인코딩하고 디코딩할 수 있으며
보통 URL에 '+'나 '/'가 들어가면 골치가 아파지니 사용하는 방식이다.
7.
에서 해당 JWT를 Encode 및 Decode해 볼 수 있다.
중요한건,
Header와 Payload는 누구나 다 볼 수 있다는 점.
JWT가 유출되면 Payload에 정보를 누구나 쉽게 볼 수 있다.
마지막 Signature부분만 Secret키에 의해 변형되는 것을 볼 수 있다.
'지식이 늘었다 > 웹개발' 카테고리의 다른 글
(유기)FastAPI - Authentication, Authorization (0) | 2025.01.05 |
---|---|
FastAPI - DB, SQLAlchemy와 ORM (0) | 2025.01.05 |
FastAPI 기초 (1) GET과 Path Parameter (1) | 2024.12.18 |
FastAPI 개발환경 세팅 (0) | 2024.12.17 |
Python의 Import와 __name__, relative import (0) | 2024.12.17 |