HTTP (HyperText Transfer Protocol) 이란?
지난 글에 웹에서 클라이언트와 서버가 통신하기 위해 HTTP 라는 통신규약을 사용한다는 것을 알려드렸습니다.
그러면 쿠키와 세션은 어떨 때 필요한 정보일까요?
HTTP 에서 아래와 같이 두 가지 큰 특징이 있습니다.
- 비연결성(connectionless): 하나의 요청에 하나의 응답을 한 후, 둘 사이에 연결을 끊는 것
- 무상태성(stateless): 통신이 끝난 후 상태 정보를 저장하지 않는 것
이 때문에 서버는 요청을 보낸 클라이언트가 누구인지 식별할 수 없습니다.
예를 들자면, admin 이라는 사용자로 로그인을 완료했을 때, 클라이언트가 서버에 특정 요청을 할 때마다 자신의 아이디를 말하지 않는 이상 서버는 클라이언트가 어떤 사용자인지 특정할 수 없습니다.
그래서 필요한 것이 cookie(쿠키) 입니다.
Cookie 란?
쿠키는 서버가 클라이언트에게 발급하는 일종의 정보입니다. 쿠키는 Key 와 Value 로 이루어져 있으며, 해당 쿠키를 발급받은 클라이언트는 서버에게 요청을 전송할 때 해당 쿠키도 같이 전송합니다.
그렇기에 쿠키는 보통 클라이언트의 정보 기록이나 상태 정보를 표현하는 용도로 사용합니다.
예를 들어, admin 이라는 사용자로 로그인을 완료했을 때, 서버는 클라이언트에게 "userid=admin" 이라는 쿠키를 발급하고, 다시 클라이언트가 서버에게 일정한 동작을 요청했을 때, "userid=admin" 이라는 쿠키 정보와 함께 전송하면 서버는 클라이언트가 admin임을 확인하고 해당 사용자에 알맞은 페이지로 응답할 수 있습니다.
하지만, 악의를 가진 사용자가 로그인을 하지 않고서 서버에게 "userid=admin"이라는 쿠키 정보와 함께 admin 사용자의 민감 데이터를 요청하게 된다면 어떻게 될까요? 누구나 다른 사람의 아이디를 도용하여 민감 정보를 탈취할 수 있겠죠?
그래서 존재하는 것이 바로 session(세션) 입니다.
Session 이란?
쿠키는 인증 상태를 클라이언트에게 저장하는 것이 였다면,
세션은 인증 정보를 클라이언트가 아닌 서버에 저장하고, 해당 정보에 접근이 가능한 랜덤한 문자열(Key)을 클라이언트의 쿠키에 저장하는 방식으로 작동합니다. 그래서 우리는 이 Key를 SessionID 라고 부르고, 브라우저는 서버와 HTTP 통신을 할 때마다 해당 키와 함께 요청하여, 서버가 해당 키에 해당하는 데이터와 인증 상태를 확인하여 응답합니다.