HTTP 프로토콜에는 **비연결성(Connectionless)**과 **비상태성(Stateless)**라는 특징이 있다.

모든 사용자의 요청마다 연결과 해제의 과정을 거치면서 연결 상태를 유지하지 않고 연결 해제 후에도 상태 정보를 저장하지 않기 때문에 서버의 자원을 크게 절약할 수 있다.

하지만 이로 인해 사용자를 식별할 수 없어서 같은 사용자가 요청을 여러번 하더라도 매번 새로운 사용자로인식하는 단점이 있다.

하지만 일반 웹사이트의 경우를 보면 , 로그인을 한 번 하고나면 그 사이트에서는 다시 로그인 할 필요 없이 여러 페이지의기능들을 이용할 수 있는 것을 볼수 있을 것이다.(세션 트래킹)

일반적으로 클라이어트에 존재하는 것이 세션 쿠키와 쿠키이고, 서버측에 저장 공간이 세션이다.

Session

세션

세션은 서버 측에서 상태 정보를 유지하기 위한 매커니즘(논리적 연결관계)이며 또 다른 의미로 서버에 있는 클라이언트에 관한 정보를 저장하는 일정 공간을 의미한다.

클라이언트와 서버 간의 연결을 유지하며, 클라이언트에 대한 고유 식별자인 세션 ID를 사용하여 클라이언트의 상태 정보를 서버에 저장한다.

세션에 관한 정보는 일반적으로 서버 메모리,데이터베이스, 파일 시스템 등을 통해 관리된다.

클라이언트가 요청할 때마다 세션 ID를 전달하여 서버는 해당 세션 ID에 연결된 상태 정보를 찾아 사용한다.

클라이언트의 세션아이디는 서버의 세션정보를 이용하려는 식별자 이며,보안성 면에서 쿠키보다 안전하며, 중요한 데이터를 저장하는 데에도 적합하다.

세션의 동작 순서

image.png

1)클라이언트가 서버에 첫번번째 Request를 보낼때는 session id가 존재하지 않는다. 2)서버에서는 session id 쿠키 값이 없는 것을 확인하고 새로 발급해서 **헤더 쿠키(Set-Cookie)**에 넣어서 응답한다. 3)이후 요청 부터는 클라이언트는 전달받은 session id 값을 헤더 쿠키(Set-Cookie)에 넣어서 요청한다. 4)서버는 이 세션 아이디를 확인하여 사용자를 식별한다. 5)클라이언트가 로그인을 요청하면 서버는 session을 로그인한 사용자 정보로 갱신하고 새로운 session id를 발급하여 응답한다. 6)이후 클라이언트는 로그인 사용자의 session id 쿠키를 요청과 함께 전달하고 서버에서도 로그인 된 사용자로 식별 가능하다.

8)로그인 한 사용자에 대해서만 세션을 생성하는 것이 아니며, 로그아웃 하면 새로운 사용자로 인식해서 새로운세션이 생성된다.

9)클라이언트 브라우저를 종료하면 session id 제거하고, 서버에서도 세션을 제거한다.

세션의 특징

세션 아이디는 브라우저 단위로 저장되고 소멸된다.

사용자의 로그인 여부, 닉네임 등 사용자가 요청할 때 마다 필요한 정보들을 세션에 담아두면 사용자 DB에 접근할 필요가 없어 효율적이 된다.

누군가 어떤 사용자의 세션 아이디를 훔친다면 그 사용자처럼 로그인 할 수 있게 되므로 일정시간 활동이 없으면 자동으로 로그인이 만료되게 설정해야 한다.

Cookie

쿠키란

클라이언트 측에서 상태 정보를 지속적으로 유지하기 위한 메커니즘이며,서버가 응답으로 클라이언트에게 전송하는 작은 텍스트 파일이다.

일반적으로 민감하지 않은 정보(예: 사용자 설정, 로그인 정보 등)를 저장하고 전송한다.

클라이언트는 받은 쿠키를 저장하고, 해당 웹 사이트에 재방문할 때마다 해당 쿠키 값을 요청과 함께 전송한다.

보안성 면에서 제약사항이 있으며, 중요한 데이터의 경우 암호화 및 안전한 전송 방식을 활용해야 한다.