웹 로그인을 구현하다 보면 세션, 토큰, 쿠키, JWT 등의 생소한 용에 대해서 다루는 이야기를 자주 들을 수 있다. 이번에 DRF-simplejwt을 이용하여 jwt 작업을 했는데 세션과 토큰 쿠키 JWT에 대한 개념이 명확하지 않아 이번 기회에 정리해보고자 한다.
쿠키
쿠키는 사용자를 기억하기 위해 서버가 사용자의 브라우저에 전송하는 작은 데이터 조각으로, key=value 형식의 문자열 데이터의 묶음이다. 브라우저는 이 문자열 데이터를 저장해 놓았다가 동일한 서버에 재요청 시 쿠키 데이터를 전송할 수 있다. HTTP 프로토콜은 기본적으로 비연결성과 무상태성을 가지고 있기 때문에 서버와 클라이언트 간의 연결 유지를 구현하기 위해 쿠키를 도입했다.
쿠키는 로컬에 저장되며, 브라우저를 종료해도 파일로 남아있다.
- 비연결성 : HTTP는 TCP연결을 맺고 요청을 보내면 서버는 응답을 보내고 연결이 끊어진다.
- 무상태성 : HTTP는 클라이언트의 상태를 따로 저장하지 않는다. 따라서 연결이 끊어지는 순간 모든 상태 정보가 사라진다.
장점 :
- 쿠키에 담긴 정보를 바탕으로 따로 로그인 인증을 할 필요가 없는 편리성
단점 :
- 보안에 취약 (요청 시 쿠키의 값을 그대로 보냄, 유출 변조의 가능성)
- 쿠키에 용량 제한이 있어 많은 정보를 담을 수 없다.
- 웹 브라우저마다 쿠키에 대한 지원 형태가 달라 브라우저간의 공유가 불가능하다.
- 쿠키 사이즈가 클수록 네트워크의 부하가 심해진다.
세션
쿠키를 통해 클라이언트의 로그인 상태를 유지시킬 수 있었지만, 쿠키가 유출되거나 변조되는 위험이 존재했다. 따라서 이를 방지하고자 세션이라는 개념을 도입하였는데 비밀번호 등의 클라이언트의 인증 정보를 쿠키가 아닌 서버에 저장하고 관리하는 방식이다.
세션은 로컬, 서버 모두에 저장되며 브라우저 종료 시 세션을 삭제한다.
장점 :
- 쿠키를 포함한 요청에 외부에 노출되더라도 세션 ID 자체는 유의미한 것이 아니다.
- 각 사용자마다 고유한 세션 ID가 발급되기 때문에, 요청이 들어올 때마다 회원정보를 확인할 필요가 없다.
단점 :
- 해커가 세션 ID을 탈취하면 클라이언트인척 위장 할 수 있다는 한계가 있다.
- 서버에서 세션 저장소를 사용하기 때문에, 요청이 많아지면 서버에 부하가 심해진다.
토큰
토큰 기반 인증 시스템은 인증받은 사용자들에게 토큰을 발급하고 서버에 요청할 때 헤더에 토큰을 함께 보내도록 하여 유효성을 검사하는 방식이다.
장점:
- 서버가 아닌 클라이언트에 저장되기 때문에 서버의 부담을 덜 수 있다.
- 앱에서는 쿠키와 세션이 없기 때문에 앱서버 통신에 용이하다.
단점 :
- 쿠키/세션과는 다르게 토큰 자체의 데이터 길이가 길어, 인증 요청이 많아질수록 네트워크 부하가 심해질 수 있다.)
- Payload자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다.
- 토큰을 탈취당하면 대처하기 어렵다. (따라서 이를 사용 기간 제한을 설정하는 식으로 극복한다)
JWT
JWT는 말 그대로 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격을 의미한다. JWT 토큰은 Base64로 인코딩 되어 있어서 육안으로 보면 eyJ로 시작하는 아주 긴 문자열의 형태를 지니고 있다.
하나의 JWT토큰은 헤더, 페이로드, 서명 이렇게 3 부분으로 이루어지며 각 구역은. 기호로 구분된다.
각 구역마다의 역할은 다음과 같다.
- 헤더 : 토큰의 유형과 서명 알고리즘 명시
- 페이로드 : claim이라고 불리는 사용자의 인증/인가 정보 명시
- 서명 : 헤더와 페이로드가 비밀키로 서명되어 저장
JWT토큰을 Base64로 디코딩하면 아래와 같은 결과를 얻을 수 있다. JWT토큰은 공간을 적게 차지하는 것이 유리하기 때문에 JSON 형식으로 데이터를 저장할 때 키를 3글자로 줄이는 관행이 있다.
HEADER
{
"alg": "HS256",
"typ": "JWT"
}
PAYLOAD
{
"token_type": "access",
"exp": 1693222889,
"iat": 1693212089,
"jti": "792e1e10098849b09eb75dd6d7684726",
"user_id": 2
}
JWT에서 자주 사용되는 JSON키는 아래와 같다.
- sub 키: 인증 주체(subject)
- iss 키: 토큰 발급처
- typ 키: 토큰의 유형(type)
- alg 키: 서명 알고리즘(algorithm)
- iat 키: 발급 시각(issued at)
- exp 키: 말료 시작(expiration time)
- aud 키: 클라이언트(audience)
참조 :
https://doheelab.github.io/web-development/jwt/
'Computer Theory > Web' 카테고리의 다른 글
RDB와 NOSQL DB (0) | 2023.12.09 |
---|---|
브라우저 작동 방식 (0) | 2023.12.09 |
HTTP 와 HTTP Request/Response 구조 (0) | 2023.12.09 |
인터넷의 역사와 작동방식 (0) | 2023.12.09 |
SSH로 원격 서버에 접속하기 (0) | 2023.08.19 |