
HTTP 프로토콜은 비연결성(요청에 대한 응답을 보낸 뒤 연결 종료), 무상태성(클라이언트에 대한 상태 정보를 유지하지 않음)이라는 특징을 가지고 있습니다. 이로 인해 사용자의 로그인 여부를 알 수 없고, 페이지를 이동할 때마다 로그인을 수행해야 하는 불편함이 발생합니다. 이와 같은 불편함을 해결하기 위해 사용하는 대표적인 방법이 쿠키와 세션입니다.
쿠키는 서버가 클라이언트(브라우저)에 저장하는 작은 텍스트 파일로 key-value 형태로 이루어져 있습니다. 클라이언트 측에 저장된 쿠키는 요청을 보낼 때마다 자동으로 서버에 전송되므로 서버가 클라이언트의 상태나 여러 정보를 파악하는 데 활용됩니다.
로그인 수행시 쿠키는 다음 그림과 같이 동작합니다.

세션은 서버가 유지하는 클라이언트 상태 정보로 일반적으로 쿠키를 사용하여 구현합니다. 서버는 클라이언트 구별을 위해 고유한 Session ID를 발급하고, 이를 쿠키에 저장하여 응답합니다. 이를 통해, 클라이언트는 매 요청마다 쿠키에 Session ID를 포함하여 요청이 이루어지고, 서버는 전달받은 Session ID로 내부에 저장된 사용자 정보를 식별합니다.
로그인 수행시 세션은 다음 그림과 같이 동작합니다.

쿠키와 세션의 가장 큰 차이는 '상태 정보를 어디에 저장하는가?' 입니다. 쿠키는 클라이언트(브라우저)에 세션은 서버 내부에 저장됩니다. 이로 인해, 서버 내부에 저장되는 세션이 보안성이 좋다는 것을 알 수 있습니다. 하지만, 서버의 자원을 사용하는 만큼 서버에 부하를 줄 수 있다는 단점또한 가지고 있습니다. 이를 고려하여 보안이 중요하지 않은 정보들은 쿠키를 활용하여 저장하고, 보안이 중요한 상태 정보는 세션을 활용하는 것이 좋을 것 같습니다.
이를 정리하자면, 다음과 같습니다.
쿠키는 클라이언트 측에 Key-Value 형태로 저장하는 작은 텍스트 파일을 의미합니다. 주로, 장바구니, 아이디 저장 등등에 사용합니다.
세션은 서버 측에서 클라이언트의 상태 정보를 저장하고 관리하는 방식으로 쿠키보다 보안성이 우수합니다. 하지만, 서버 자원을 이용하기 때문에 부하를 줄 수 있으므로 무분별한 사용은 지양해야합니다.
세션은 보안적으로 우수하지만 서버 자원을 소모하기 때문에 과도한 사용으로 인해 서버에 부하를 줄 수 있다는 단점이 있습니다. 이로 인해, 비교적 보안이 중요하지 않은 정보들은 쿠키를 사용해 저장합니다.
악의를 가진 사용자가 Session ID를 탈취하여 서버에 요청하는 것을 말합니다. 이에 대한 해결책으로는 HTTPS 사용과 Session의 만료 시간을 짧은 주기로 설정하는 방법이 있습니다.
세션과 쿠키를 이용한 로그인 방식은 로드 밸런싱, 서버 효율성 관리, 확장이 어려워질 수 있습니다. 이는 여러 대의 서버를 사용하는 시스템의 경우, 유저 로그인 시 처음 로그인했던 서버로만 요청을 보내도록 설정해야 하기 때문입니다.