세션의 사전적 정의를 찾아보면 다음과 같다. (위키 백과, TCP 스쿨)
단순히, 세션이란 말은 통신을 하기 위해 서로 연결된 순간부터 통신을 마칠 때 까지의 기간을 의미한다고 한다. HTTP 세션이란 클라이이언트가 웹서버에 연결된 순간부터 웹 브라우저를 닫아 서버와의 HTTP 통신을 끝낼 때 까지의 기간이라고 할 수 있는 것이다.
사전적/범용적인 의미를 알면 브라우저의 세션 스토리지 개념과 혼동하지 않게 된다.
하지만 다시 브라우저에서 세션 스토리지는 왜 세션이라는 말을 쓰는지 정리해보면 다음과 같다. (gpt 답변)
세션 스토리지가 왜 세션이라는 용어를 사용하는지에 대해서는 명확한 답변이 없습니다. "세션(session)"이라는 용어는 일반적으로 사용자와 컴퓨터 시스템 간의 상호작용 기간을 의미합니다.
따라서 세션 스토리지는 사용자와 웹 애플리케이션 간의 상호작용 기간 동안 데이터를 저장하는 데 사용됩니다. 세션 스토리지는 브라우저가 종료될 때까지 데이터를 유지하며, 이는 일반적으로 세션의 수명과 일치합니다.
브라우저의 세션 스토리지와 우리가 말하고 있는 사용자 식별 메커니즘 세션은 같은 뜻이 아니다.
웹 서버 관점에서 세션은 사용자 정보(세션 상태, 클라이언트 상태, 세션 데이터 등)를 저장해 놓는 매커니즘을 가리키는 말이 된다.
세션 쿠키(고유한 세션 ID 값)를 클라이언트에게 주어 서버가 클라이언트를 식별할 수 있도록 하는 방식자체를 의미하는 것이다.
(이제 세션을 서버의 세션으로 제한하고 쓰겠다.)
HTTP는 통신이 끝나면 상태를 유지하지 않는 특징이 있다. 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나며 상태 정보는 유지하지 않는 특성이다.
처음 사용자가 요청을 보내 서버가 식별을 마친다 해도,
그 다음 요청에서는 해당 사용자에 대한 식별 상태가 남아있을 수 없는 것이다.
이런 HTTP의 특성을 보완하고자 쿠키라는 개념이 고안되었다.
쿠키는 상태를 저장할 수 있는 방법 중 하나로 볼 수 있다.
클라이언트, 브라우저가 쿠키의 값을 저장하고 있다가, 서버에 요청을 보낼때 HTTP에 쿠키를 설정해 함께 전송하게 된다.
GET /user/cartItems HTTP/1.1
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Authorization: Basic cG96QHdvb3RlY28uY29tOjExMTE=
Connection: keep-alive
Cookie: JSESSIONID=F9623FF317AD896237D7231285E0F731 // ✨ 여기
쿠키를 설정한 http 요청이다. 맨 밑의 Cookie를 확인할 수 있다.
이렇게 요청 헤더에 추가해서 보낼 수 있는 것이다.
이 외에도 쿠키 사용법은 더 좋은 글들을 참고하자.
https://developer.mozilla.org/ko/docs/Web/HTTP/Cookies
쿠키는 브라우저에서 직접 접근할 수 있는 경우가 있고 그렇지 않다고 해도 패킷을 통해 탈취당할 위험이 있기도 하다.
그래서 사용자의 중요 정보 (ex. 비밀번호) 같은 것들은 저장할 수 없게 된다.
중요정보, 탈취 당하면 안되는 상태 정보들을 위해 다른 방식이 필요해졌고,
그 중 하나가 세션이 되겠다.
세션은 쿠키와 달리 클라이언트와의 연결 정보, 상태 등을 서버에서 관리하는 방식이다.
하지만 앞서 말한 것처럼, 세션을 사용하기 위해서는 클라이언트도 정보를 가지고 있어야하는데, 바로 세션 ID이다.
(사실 세션 ID라는 상태를 클라이언트가 가져야된다는 것이다.ㅎㅎ)
클라이언트가 세션 ID를 얻는 방식은 다음과 같다.
세션아이디가 없을 때 서버가 이런 식으로 처리를 할 것이다.
그럼 추후에 클라이언트는 서버에 요청을 보낼 때 자신의 식별자인 세션아이디를 함께 보낼 수 있다.
사실 세션도 완벽한 보안성을 보장하지는 못할 것이다.
예를 들어, 공격자에게 세션 ID를 탈취당한다면 서버에 요청을 보내 세션을 조작할 수 있게될 것이다.
또한, 서버에 세션 정보를 저장하므로 서버의 부하가 증가할 수 있다.
또한, 세션은 사용자가 로그아웃하기 전에는 계속해서 서버에서 유지되므로, 사용자의 로그아웃을 감지하고 세션을 종료하는 추가적인 작업이 필요합니다.
이 외에도 세션 정보를 가지게 된 서버는 상태를 관리하게 되므로
수평적 스케일링이 어려워진다는 단점도 있는데, 이건 다른 좋은 글들을 참고하자.