cs

쿠키는 stateful할까 stateless할까? (feat. Authentication)

ssoonn 2024. 12. 18. 10:22

 

쿠키 자체는 stateless이나, 
쿠키가 무엇을 담고 활용하느냐에 동작이 달라질 수 있다.

 

stateful, stateless

state를 서버에 있는 데이터라고 했을 때

stateful stateless
서버측에 state 有 서버측에 state 無
client-server 간 상호작용에서 이전 상태를 유지 모든 요청이 독립적이고, 요청 자체에 필요한 정보가 모두 포함
서버에 저장된 데이터(state)를 기반으로 사용자 요청 처리 서버 확장성에 유리

 

쿠키는 단순한 데이터 저장소이기 때문에 stateless이다.

 

HTTP는 기본적으로 stateless라고 말할 수 있다.

  • 클라이언트의 이전 요청 상태를 기억하지 않기 때문에 독립적인 요청으로 처리한다
    • 이 특성 덕분에, 서버는 클라이언트 상태를 관리할 필요가 없으므로 확장성(Scalability)이 뛰어나다.
    • 서버의 확장성: 서버마다 데이터를 저장하지 않고, state가 모든 서버의 데이터를 관리

 

stateless의 치명적인 문제: 상태를 유지해야 할 때

그렇다면, HTTP에서는 state를 받기 위해 매번 인증할 것인가? -> stateful이 필요 e.g. 로그인 후 상태 유지

  • 어떻게 stateful로 인증을 유지할 것인가? -> @인증방법

 

 

인증 방법

인증 방법 client (cookie) server (session)  
Session-based SESSION_ID 세션 정보 언제, 누가? stateful
Token-based JWT 언제, 누가?  - stateless

 

Session-based 인증방식은 쿠키에 저장된 SESSION_ID를 통해 세션 정보에 접근한다.

  • 쿠키에는 단순히 SESSION_ID만 저장되고, 실제 세션 데이터는 서버에 저장된다.
  • 세션 정보를 저장하는 용도로 쿠키를 사용하면, 서버가 상태를 관리하기 때문에 stateful한 방식이 된다.

Token-based 인증방식의 경우, 정보인 JWT가 쿠키에만 저장되어 있다.

  • 서버는 상태를 저장하지 않고, 쿠키에 저장된 JWT 토큰을 검증만 한다.
  • 쿠키에는 JWT만 저장되므로, stateless하다.

session-based auth token-based auth
1. 사용자 로그인
사용자는 이메일과 비밀번호를 서버에 요청하여 로그인

2. 상세 정보 확인
서버는 제공된 정보가 저장된 사용자 정보와 일치하는지 확인

3. (정보가 일치할 경우) 세션 생성
서버는 사용자 ID, 권한, 시간 제한 등 정보를 포함한 세션을 생성,
서버 저장소에 보관

4. 세션 ID 발급
서버는 생성된 세션의 ID를 사용자 기기에 쿠키로 전송

5. 세션 ID 사용
이후 유저가 서버에 요청할 때마다, 자동으로 세션 ID가 포함되어 요청 전달

6. 서버 확인
서버는 요청에서 받은 세션 ID를 사용 -> 세션 저장소에서 정보 조회

7. (세션 정보가 맞을 경우) 접근 허용
서버는 사용자에게 요청한 자원에 대한 접근 허가
1. 사용자 로그인 요청
사용자는 이메일과 비밀번호를 서버에 전송하여 로그인


2. 자격 증명 확인

서버: 제공된 자격 증명과 저장된 사용자 데이터의 일치 여부 판단

3. (인증 성공할 경우) 토큰 생성
서버가 사용자 정보(user_id, 권한 등)를 포함하는 토큰(JWT) 생성

4. 토큰 서명 및 해싱
생성된 토큰은 비밀 키로 서명 -> 해싱 알고리즘을 사용해 해시 값으로 

5. 토큰 전송
서버: 해당 토큰을 클라이언트로 전송
클라이언트: 서버로부터 받은 토큰 저장

6. 토큰 저장 옵션
HttpOnly 쿠키, 세션 스토리지, 로컬 스토리지 등
(보안을 위해 HttpOnly 쿠키 저장을 권장)


8. 요청에 토큰 포함

클라이언트는 서버에 요청할 때마다 Authorization 헤더에 토큰을 포함시켜 전송

 

 

 

ref.

https://security.stackexchange.com/questions/225673/is-session-cookie-based-authentication-stateful-or-stateless

 

Is session/cookie based authentication stateful or stateless?

Flask Web Development says The current login functionality implemented with the help of Flask-Login stores data in the user session, which Flask stores by default in a client-side cookie, so the

security.stackexchange.com

https://dev.to/fidalmathew/session-based-vs-token-based-authentication-which-is-better-227o

 

🔐 Session-Based vs. Token-Based Authentication: Which is better?🤔

Hi fellow readers!✋ I hope you’re doing great. In this article, we will learn about session and...

dev.to