[네트워크] RESTful server 세션 관리

yjseo·2024년 10월 24일
post-thumbnail

C언어로 RESTful server를 만드는 중인데,
세션 관리를 구현해야 한다.

rest의 특징 중 하나가 stateless (무상태성) 이라는데, 상태는 뭐고 세션은 뭐지..😭
어떻게 세션 관리를 해야 하는지 잘 모르겠어서 정리해보려고 한다.

세션 관리가 뭘까

HTTP의 특성 중 하나가 Stateless 이다.
= 클라이언트와 서버가 서로 통신할 때, request-response가 한 번 이루어지면 클라이언트에 대한 정보를 유지하지 않는다.
= 한 번의 통신 후에는 클라이언트와 서버의 관계가 끊어짐

이는 서버가 클라이언트의 정보를 불필요하게 유지하게 되면 서버가 무거워지기 때문이다.

하지만 사용자의 상태 정보의 유지가 필요할 때가 있다.
예)
로그인 정보를 미리 저장하지 않으면 DM 확인, 좋아요 누르기 등의 작업을 할 때마다 로그인을 새로 해야 함

이러한 번거로움을 해결하기 위해 쿠키세션으로 세션을 관리한다.

즉, 세션 관리의 목적은 사용자 정보를 일정 조건 동안 유지하는 것이다.

쿠키

클라이언트(브라우저) 측에 사용자 상태 정보를 저장한다.
간단한 상태 유지에 적합하다.

  • 저장 위치:
    • 클라이언트(사용자의 웹 브라우저)에 저장
  • 사용 목적:
    • 클라이언트 측에서 정보를 저장하여 서버에 재전송
    • 클라이언트의 상태 정보 유지
  • 수명:
    • 세션 쿠키: 브라우저가 종료되면 삭제됨
    • 영구 쿠키: 쿠키에 설정된 만료 시간이 지나면 삭제됨
  • 전송 방식
    • 쿠키는 매 요청 시 클라이언트(브라우저) -> 서버 자동 전송
  • 보안:
    • 사용자가 임의로 수정하거나 읽을 수 있는 보안 취약점 있음
    • 중요한 정보는 쿠키에 저장하지 않는걸 권장
    • HttpOnlySecure같은 속성으로 보안성 강화
  • 용량 제한:
    • 일반적으로 하나의 쿠키 당 4KB까지 저장 가능
    • 각 도메인에서 사용할 수 있는 쿠키의 수는 대략 20~50개로 제한적

예) 웹사이트의 "로그인 상태 유지" 기능, 사용자 환경 설정 저장(언어, 테마 등)

세션

서버 측에 사용자 상태 정보를 저장한다.
중요한 정보를 안전하게 관리할 때 사용된다.

  • 저장 위치:
    • 서버 측에 저장
    • 클라이언트는 서버가 발급한 세션 ID만을 가지고 있음
    • 이 ID를 통해 서버가 세션 데이터를 참조함
  • 사용 목적:
    • 로그인 상태와 같은 중요한 정보를 관리하기 위해 사용
    • 클라이언트와 의 상태를 서버 측에서 안전하게 유지할 수 있음
  • 수명:
    • 일반적으로 사용자가 브라우저를 닫거나 일정 기간 동안 활동이 없을 경우 만료
    • 서버 측에서 세션 수명을 설정할 수 있음
  • 전송 방식:
    • 서버 -> 클라이언트 : 세션 ID 발급
    • 클라이언트 -> 서버 : 요청마다 세션 ID 전송
    • 세션 ID는 주로 쿠키를 통해 전송, URL에 포함시킬 수도 있음
  • 보안:
    • 클라이언트가 세션 데이터를 임의로 변경할 수 없음
    • 세션 ID가 유출될 경우 세션 하이재킹 위험이 있음
    • 세션 ID를 안전하게 전송하고 관리하는 것이 중요
  • 용량 제한:
    - 서버의 메모리나 데이터베이스에 저장되기 때문에 쿠키보다 더 많은 데이터 저장 가능

예) 로그인 후 사용자 인증 유지, 장바구니 정보 유지, 특정 사용자의 작업 상태 관리

쿠키와 세션의 차이점


그렇다면 keep-alive는 무엇일까

HTTP 연결을 지속적으로 유지하는 방식
클라이언트와 서버 간의 연결을 request-response 이후에도 닫지 않고 유지하여 여러 요청을 동일한 TCP 연결을 통해 처리할 수 있도록 함
매번 새로운 연결을 열고 닫는 오버헤드를 줄여 성능을 개선 및 네트워크 자원 절약


  • HTTP/1.0
    • 기본적으로 request-response 후 연결을 닫는 방식
    • Connection: keep-alive 헤더 를 추가하여 연결 유지
  • HTTP/1.1
    • 기본적으로 모든 연결이 keep-alive로 설정
    • 연결을 닫으려면 클라이언트가 명시적으로 Connection: close를 보내야 함

장점

  • 성능 향상
    • 매번 TCP 연결을 새로 열고 닫는 시간을 절약해 대기 시간이 줄어듦
  • 네트워크 자원 절약
    • 한 번 열린 TCP 연결을 여러 요청에 사용
    • 서버 및 클라이언트 측에서 리소스 덜 사용하게 됨
  • 지속적인 연결
    • 여러 연결 요청을 동일한 연결을 통해 처리
    • 연결 설정 및 종료에 따른 부하가 줄어듦

결론

Session은 서버가 클라이언트의 상태 정보를 저장하는 방식이다. Cookie 등을 통해 클라이언트를 식별하여 지속적인 상태 관리를 제공한다.
Keep-Alive연결 자체를 유지하는 방식이다. 한 번 연결되면 여러 HTTP 요청을 처리할 수 있도록 연결이 유지된다.


참고
https://interconnection.tistory.com/74
https://creamilk88.tistory.com/101
https://etloveguitar.tistory.com/137
🤖 Chat GPT

profile
저 뭐해먹고 살아요..🥺

0개의 댓글