SpringBoot/개념정리
쿠키, 세션, JWT
공부 기록장
2025. 1. 6. 17:06
쿠키(Cookie)란?
브라우저(크롬, 엣지)가 서버로부터 받은 데이터를 클라이언트(사용자)의 컴퓨터에 저장하는 작은 파일로
주로 사용자 식별 정보나 설정 값을 저장한다.
특징
1. 브라우저는 서버에서 받은 쿠키를 저장해두었다가 동일한 서버로 요청할 때마다 쿠키를 함께 전송한다.
2. 참고로 쿠키는 도메인에 따라 제한이 된다.
예를 들면 유튜브가 준 쿠키는 유튜브에게만 전송된다.
3. 쿠키는 유효기간이 있다.
서버가 정한 기간에 따라 유효하다.
4. 쿠키는 인증뿐만 아니라 여러가지 정보를 저장할 수 있다.
예를 들면 내가 유튜브에 들어가서 언어설정을 한국어로 바꾸면 서버는 내가 선택한 언어를 저장한 쿠키를 주고
다음에 내가 유튜브에 들어갈 때 쿠키는 요청과 함께 서버로 보내지고 유튜브는 내가 설정한 언어로 이루어진 웹사이트를 보여준다.
5. 보안에 취약하다.
데이터가 클라이언트에 저장되므로 변조나 탈취 위험이 있다.
구성요소
- Name(이름) : 쿠키를 구별하는 데 사용되는 키 (중복 불가)
- Value(값) : 쿠키의 값
- Domain(도메인) : 쿠키가 저장된 도메인
- Path(경로) : 쿠키가 사용되는 경로
- Expires(만료기한) : 쿠키의 만료기한
세션(Session)이란?
서버에서 사용자 상태를 유지하는 기술로
클라이언트는 서버에 저장된 세션을 식별하기 위해 세션ID를 쿠키로 함께 받는다.
여기서 쿠키는 세션ID를 전달하기 위한 매개체로 사용된다.
만약 Lion 이라는 사용자가 유튜브에 아이디와 비밀번호를 입력하고 엔터를 누르면
이 정보는 유튜브에 전달되고 유튜브에서는 세션DB에 Lion 이라는 유저의 세션ID를 저장하고
브라우저에게는 세션ID가 담긴 쿠키를 전달한다. (이 때 세션DB로는 주로 Redis를 사용)
Lion이 유튜브에서 다른 페이지로 넘어갈 때마다 브라우저는 세션ID를 가지고 있는 쿠키를 유튜브에 보내고
유튜브에서는 세션DB에서 해당 세션ID가 있는지 확인하여 해당 사용자가 누군지 확인할 수 있다.
이 프로세스는 Lion이 다른 페이지로 넘어갈 때마다 반복된다.
특징
1. 서버가 유저의 상태정보를 유지하는 stateful 방식이다.
2. 유저가 늘어남에 따라 DB 리소스가 더 필요하게 된다.
3. 요청이 많아지면 서버 부하가 심해진다.
4. 사용자의 로그인 정보를 주고 받지 않기 때문에 상대적으로 안전하다.
JWT(Json Web Token)이란?
인증에 필요한 정보들을 암호화시킨 토큰으로
JWT 토큰을 HTTP 헤더에 담아 서버가 해당 클라이언트를 식별하는 방식이다.
특징
1. 동시 접속자가 많을 때 서버 부하를 줄일 수 있다.
2. 인증 정보를 서버에 별도로 저장할 필요가 없다. 서버의 stateless 특성 유지
3. JWT에 담는 내용이 커질수록 네트워크 비용이 증가한다.
4. 이미 생성된 JWT를 일부만 만료시킬 방법이 없다.
5. secret key 유출 시 JWT 조작이 가능하다.
구성요소
- Header(토큰 타입, 해쉬 알고리즘 정보를 담은 부분)
{
"alg": "HS256", // 서명에 사용하는 알고리즘 (예: HMAC-SHA256)
"typ": "JWT" // 토큰 타입
}
- Payload(사용자 정보 및 데이터를 담은 부분)
{
"sub": "1234567890", // 사용자 ID
"name": "John Doe", // 사용자 이름
"iat": 1516239022 // 토큰 발급 시간 (Unix Timestamp)
}
- Signature(토큰의 위변조 여부를 확인하기 위한 서명)
HMACSHA256(
base64UrlEncode(Header) + "." + base64UrlEncode(Payload),
secretKey
)