Home > Architecture > πŸ—οΈ[Architecture] Stateless 방식 vs Stateful 방식

πŸ—οΈ[Architecture] Stateless 방식 vs Stateful 방식
Architecture Software Architecture System Design

πŸ—οΈ[Architecture] Stateless 방식 vs Stateful 방식.

  • Stateless(λ¬΄μƒνƒœ)와 Stateful(μƒνƒœ μœ μ§€) 방식
    • β†˜οΈŽ μ‹œμŠ€ν…œμ΄λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‚¬μš©μž μƒνƒœλ₯Ό μ–΄λ–»κ²Œ κ΄€λ¦¬ν•˜λŠ”μ§€μ— λŒ€ν•œ 섀계 νŒ¨ν„΄.
    • β†˜οΈŽ 주둜 인증(Authentication)κ³Ό μ„Έμ…˜ 관리(Session Management)μ—μ„œ μ€‘μš”ν•œ κ°œλ…

1️⃣ Stateless(λ¬΄μƒνƒœ) 방식.

πŸ“Œ μ •μ˜.

  • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ” 방식
  • 각 μš”μ²­(Request)λŠ” 독립적, 이전 μš”μ²­(Request)의 μƒνƒœλ‚˜ 정보λ₯Ό κΈ°μ–΅ν•˜μ§€ μ•ŠμŒ.
  • JWT(JSON Web Token)와 같은 토큰 기반 인증이 주둜 μ‚¬μš©.

πŸ› οΈ μž‘λ™ 방식.

  • 1️⃣ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— 둜그인 μš”μ²­μ„ 함.
  • 2️⃣ μ„œλ²„λŠ” JWT(Access Token + Refresh Token)λ₯Ό λ°œκΈ‰ν•¨.
  • 3️⃣ ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ μ‹œλ§ˆλ‹€ Access Token을 헀더에 포함해 보냄.
  • 4️⃣ μ„œλ²„λŠ” ν•΄λ‹Ή Access Token의 μœ νš¨μ„±μ„ 검증함.
  • 5️⃣ μƒνƒœ(μ„Έμ…˜ λ“±)λŠ” 토큰 λ‚΄ νŽ˜μ΄λ‘œλ“œ(Payload)에 μ €μž₯됨.

πŸ™Œ νŠΉμ§•.

  • μ„œλ²„ ν™•μž₯μ„±.
    • β†˜οΈŽ μ—¬λŸ¬ μ„œλ²„μ— λΆ„μ‚° λ°°ν¬ν•˜κΈ° 쉬움.
  • λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ μ΅œμ†Œν™”.
    • β†˜οΈŽ μ„œλ²„λŠ” μ„Έμ…˜ 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ λ©”λͺ¨λ¦¬ μ†Œλͺ¨κ°€ 적음.
  • μœ μ—°ν•œ 인증 처리.
    • β†˜οΈŽ 쀑앙 집쀑식 인증 μ„œλ²„λ‘œ ꡬ성 κ°€λŠ₯.
  • λ³΄μ•ˆ 취약점.
    • β†˜οΈŽ 토큰 유좜 μ‹œ μ•…μš©λ  μœ„ν—˜μ΄ 있음.(토큰 만료 μ‹œκ°„, HTTPS μ‚¬μš© ν•„μš”.)

πŸ“ μ˜ˆμ‹œ.

  • JWT(JSON Web Token)λ₯Ό μ‚¬μš©ν•œ 인증
  • API Gatewayλ₯Ό 톡해 Stateless 인증 처리

πŸ‘ μž₯점.

  • μ„œλ²„κ°€ μ„Έμ…˜μ„ μ €μž₯ν•  ν•„μš”κ°€ μ—†μ–΄ ν™•μž₯성이 뛰어남.
  • λ‘œλ“œ λ°ΈλŸ°μ‹±(Load Balancing)에 유리.
  • μš”μ²­λ§ˆλ‹€ 인증이 λ…λ¦½μ μœΌλ‘œ μˆ˜ν–‰.

⚠️ 단점

  • 토큰이 ν΄λΌμ΄μ–ΈνŠΈμ— μ €μž₯λ˜λ―€λ‘œ λ…ΈμΆœ μœ„ν—˜μ΄ 쑴재.
  • λ‘œκ·Έμ•„μ›ƒ 처리 μ‹œ Access Token은 λ¬΄νš¨ν™”ν•˜κΈ° 어렀움.
    • β†˜οΈŽ Refresh Token을 λ¬΄νš¨ν™”ν•˜μ—¬ μ²˜λ¦¬ν•¨.

2️⃣ Stateful(μƒνƒœ μœ μ§€) 방식.

πŸ“Œ μ •μ˜.

  • μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœ 정보λ₯Ό μ €μž₯ν•˜κ³  관리함.
  • 주둜 μ„Έμ…˜(Session)을 μ‚¬μš©ν•΄ ν΄λΌμ΄μ–ΈνŠΈμ˜ μƒνƒœλ₯Ό μœ μ§€ν•¨.
  • μ‚¬μš©μžμ˜ 둜그인 μƒνƒœλ‚˜ κΆŒν•œ 정보가 μ„œλ²„ λ©”λͺ¨λ¦¬ λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€(DataBase, DB)에 μ €μž₯됨.

πŸ› οΈ μž‘λ™ 방식.

  • 1️⃣ ν΄λΌμ΄μ–ΈνŠΈκ°€ 둜그인 μš”μ²­μ„ 함.
  • 2️⃣ μ„œλ²„λŠ” μ„Έμ…˜ ID(Session ID)λ₯Ό μƒμ„±ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 전달함.
  • 3️⃣ μ„œλ²„λŠ” ν•΄λ‹Ή μ„Έμ…˜ ID(Session ID)λ₯Ό 기반으둜 μ‚¬μš©μžμ˜ μƒνƒœ 정보λ₯Ό μ €μž₯함.
  • 4️⃣ ν΄λΌμ΄μ–ΈνŠΈλŠ” μš”μ²­ μ‹œλ§ˆλ‹€ μ„Έμ…˜ ID(Session ID)λ₯Ό μΏ ν‚€λ‚˜ 헀더에 포함해 보냄.
  • 5️⃣ μ„œλ²„λŠ” μ„Έμ…˜ μ €μž₯μ†Œλ₯Ό 톡해 μƒνƒœλ₯Ό 확인함.

πŸ™Œ νŠΉμ§•.

  • μƒνƒœ μœ μ§€.
    • β†˜οΈŽ μ„œλ²„κ°€ μ‚¬μš©μžμ˜ μ„Έμ…˜μ„ μœ μ§€ν•˜λ©° μƒνƒœλ₯Ό 좔적함.
  • μ„Έμ…˜ μ €μž₯μ†Œ.
    • β†˜οΈŽ μƒνƒœ μ •λ³΄λŠ” μ„œλ²„ λ©”λͺ¨λ¦¬, Redis, DB 등에 μ €μž₯됨.
  • λ‘œλ“œ λ°ΈλŸ°μ‹± 문제.
    • μ‚¬μš©μžκ°€ λ‹€λ₯Έ μ„œλ²„μ— μ ‘κ·Όν•˜λ©΄ μ„Έμ…˜ 정보가 없을 수 있음.(Sticky Session μ‚¬μš© ν•„μš”.)

πŸ“ μ˜ˆμ‹œ.

  • HttpSession을 μ‚¬μš©ν•œ μ„Έμ…˜ 관리.
  • Redisλ₯Ό μ‚¬μš©ν•œ μ„Έμ…˜ ν΄λŸ¬μŠ€ν„°λ§

πŸ‘ μž₯점.

  • μ„Έμ…˜ λ¬΄νš¨ν™”κ°€ μ¦‰μ‹œ κ°€λŠ₯ (λ‘œκ·Έμ•„μ›ƒ μ‹œ μƒνƒœ 관리 κ°€λŠ₯)
  • μ‚¬μš©μžλ³„ μƒνƒœλ₯Ό μ‰½κ²Œ 관리할 수 있음

⚠️ 단점

  • μ„œλ²„ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰ 증가.
  • λ‘œλ“œ λ°ΈλŸ°μ‹± 문제 λ°œμƒ(Stick Session ν•„μš”)
  • μ„œλ²„ ν™•μž₯ μ‹œ μ„Έμ…˜ 정보 동기화 ν•„μš”

3️⃣ μ–΄λ–€ 방식을 선택해야 ν• κΉŒ? πŸ€”

1️⃣ Stateless(λ¬΄μƒνƒœ) 방식 μΆ”μ²œ μ‹œλ‚˜λ¦¬μ˜€.

  • RESTful API μ„œλΉ„μŠ€.
  • λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜.
  • μ„œλ²„ κ°„ λΆ€ν•˜ λΆ„μ‚°(λ‘œλ“œ λ°ΈλŸ°μ‹±)이 ν•„μš”ν•  λ•Œ.
  • 높은 ν™•μž₯성이 ν•„μš”ν•  λ•Œ.

2️⃣ Stateful(μƒνƒœ μœ μ§€) 방식 μΆ”μ²œ μ‹œλ‚˜λ¦¬μ˜€.

  • μƒνƒœλ₯Ό μ§€μ†μ μœΌλ‘œ 관리해야 ν•˜λŠ” 경우.
  • 즉각적인 μ„Έμ…˜ λ¬΄νš¨ν™”κ°€ ν•„μš”ν•œ 경우.
  • λŒ€κ·œλͺ¨ μ‚¬μš©μž μ„Έμ…˜ 관리가 ν•„μš”ν•  λ•Œ.

4️⃣ ν•˜μ΄λΈŒλ¦¬λ“œ 접근법.

  • Stateless (Access Token) + Stateful (Refresh Token)
    • β†˜οΈŽ Access Token πŸ‘‰ Stateless둜 인증을 μˆ˜ν–‰.
    • β†˜οΈŽ Refresh Token πŸ‘‰ Stateful둜 μ„œλ²„κ°€ μœ νš¨μ„±μ„ 관리.

5️⃣ ꢌμž₯ μ ‘κ·Ό 방식 πŸ™‹β€β™‚οΈ

  • 인증: Stateless (JWT).
  • μ„Έμ…˜ 관리: Stateful (Refresh Token 관리).
  • λ‘œκ·Έμ•„μ›ƒ 처리: Refresh Token을 revokeν•˜κ³  Access Token은 ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ 제거.

πŸš€ κ²°λ‘ .

  • Stateless(λ¬΄μƒνƒœ) 방식.
    • β†˜οΈŽ ν™•μž₯μ„±κ³Ό μœ μ—°μ„±μ΄ λ›°μ–΄λ‚˜λ©°, API 인증에 적합함.
  • Stateful(μƒνƒœ μœ μ§€) 방식.
    • β†˜οΈŽ μ‚¬μš©μžμ˜ μ„Έμ…˜ 정보λ₯Ό 관리해야 ν•˜λŠ” 경우 μœ λ¦¬ν•¨.
  • ν˜„λŒ€μ μΈ μ•„ν‚€ν…μ²˜μ—μ„œλŠ” Stateless 방식을 주둜 μ‚¬μš©ν•˜λ©°, Refresh Token을 톡해 ν•„μš”ν•œ λΆ€λΆ„λ§Œ Stateful둜 κ΄€λ¦¬ν•˜λŠ” ν•˜μ΄λΈŒλ¦¬λ“œ 방식이 널리 μ‚¬μš©λ¨.