HTTP의 특징과 쿠키, 세션을 사용하는 이유
서버가 클라이언트와 통신할 때, 서버는 클라이언트가 누구인지 계속 인증해야한다.
왜냐하면 HTTP프로토콜이 Connectionless, Stateless한 특성이 있기 때문이다.
- Connectionless: 비연결성 - 연결을 유지하지 않는다.
- Stateless: 무상태성 - 상태를 유지하지 않는다.
Stateless란
상태가 없다는 의미이다. HTTP에서 stateless하다는 건 서버 입장에서 클라이언트의 상태가 없다는 의미로 동일한 클라이언트의 요청이라도 매번 각 요청은 독립적이라는 의미이다. 예를들어 놀이공원(서버)에 손님이 입장(요청)했다가, 퇴장(응답)했을 때 손님 한명 한명 다 기억할 수 없다. 그렇기 때문에 놀이공원에서는 재입장하는 손님을 구분하기위해 팔찌같은 입장권을 준다.
마찬가지로 서버에서도 이미 요청을 했었던 클라이언트인지 매번 확인하기 어렵기 때문에 입장권처럼 쿠키를 주는 것이다.
Connectionless 한 특성이 있기 때문에 Stateless해진다고 보면 된다.
클라이언트가 서버에 요청을 보내고, 서버가 그에 대한 응답을 보내면 연결이 끊어진다.
이는 요청에 대한 응답을 처리하게 되면 연결이 끊어져(Connectionless) 이전 정보나 현재 통신 상태(Stateless)가 남아있지 않는다.
즉, 연결 상태가 유지되지 않기 때문에 클라이언트는 서버에게 요청할 때 마다 "연결상태를 유지하기위한 정보(인증)을 추가적으로 전달"해주어야 한다.
이러한 특징들 때문에 쿠키와 세션을 사용해 클라이언트의 접근성을 높여야 한다.
쿠키와 세션을 사용한 경우 최초 로그인을 하면 어떤 방식에 의해서 서버가 그 사용자에대한 인증을 유지하게 된다.
즉, 쿠키와 세션을 통해 서버는 클라이언트를 기억하고 있는것이다.
쿠키(Cookie)
쿠키란 클라이언트(브라우저, 앱 등..)에서 관리되는 작은 기록 정보 파일?
서버가 클라이언트에게 전달하는 데이터?
브라우저가 서버에게 어떤 요청을 보낼 때 마다 서버는 클라이언트가 요청한 정보(Payload)와 함께 쿠키를 응답으로 보낸다.
그리고 브라우저가 갖고있는 이 쿠키는 서버에게 요청을 보낼 때 같이 전달된다.
세션(Session)
세션은 인증을 처리하는 전통적인 접근법이다. 세션은 서버가 사용자(브라우저)에게 접근권을 줄 때 서버가 사용자를 위한 고유한 식별자(Session ID)를 만들고 서버에 저장한다. 모든 웹사이트 방문자는 인증을 받으면 각 사용자의 고유한 식별자인 Session ID가 서버에 저장된다.
HTTP의 Stateless와 Connectionless특징으로 인해 클라이언트와 서버간 상태를 유지하기위해 Session을 사용한다. 즉 Session이란 서버와 클라이언트간 상태 정보를 유지하기위한 기술이라고 볼 수 있다.
즉, 모든 웹사이트 방문자는 인증을 받으면 각 사용자의 고유한 식별자인 SessionID가 서버에 저장된다. 이 SessionID는 서버에만 저장되는 것이 아니고 사용자에게도 쿠키로 전달된다. 따라서 서버의 응답은 단순한 "접근", "접근불가"만이 아니라 SessionID도 포함된다. 그리고 사용자가 서버에게 요청을 보낼 때는 Session ID와 함께 보내면 서버측에서 갖고있는 SessionID와 일치하는지 검사하여 접근할 수 있는지, 없는지 검사한다. 만약 브라우저가 전달한 SessionID가 서버가 갖고있는 SessionID와 일치하지 않는다면 접근 요청을 거부하게된다.
세션 작동방식
세션의 작동방식은 우선 클라이언트가 서버에 요청을 보내면 서버에서는 요청헤더(Cookie)를 확인하고 SessionID가 있는지 확인한다.
만약 요청에 SessionID가 없다면 서버에서는 SessionID를 생성한 뒤 응답을 보낼 때 쿠키에 SessionID를 담아서 보낸다.
클라이언트는 응답받은 세션쿠키(SessionID)를 저장해두고, 매번 해당 서버에 요청을 보낼 때 마다 세션쿠키를 함께 보내서 자신이 누구인지 인증한다. 세션 쿠키는 브라우저가 종료되면 삭제된다.
쿠키와 세션의 관계
흔히 쿠키는 "클라이언트(웹브라우저, 앱 등..)에 정보를 저장하는 것이도 세션은 서버에 정보를 저장하는 것이다." 라고 비교한다. 맞는 말이지만 마치 서로 반대되는 개념이다라고 오해할 수 있다. 결국 세션은 쿠키를 이용하는 하나의 방식일 뿐이다. 쿠키는 stateless한 http통신에서 클라이언트에게 정보를 주어 해당 클라이언트를 식별하기 위해 만들어졌다. 클라이언트가 식별이 가능해야 서버는 특정 클라이언트와 계속해서 통신을 하고 있는지 확인이 가능하기 때문이다.
하지만 클라이언트에 저장된다는 쿠키의 특징은 보안에 있어서 치명적인 단점이다.
예를 들어 로그인을 위해 사용자가 입력한 아이디와 비밀번호를 쿠키에 담아 클라이언트에 저장한 뒤 서버는 쿠키로 해당 사용자가 로그인한 사용자인지 확인한다고 생각해보자. 그러면 누군가 마음만 먹으면 쿠키를 확인해 클라이언트에 저장된 아이디와 비밀번호를 볼 수 있다.
그래서 세션이라는 개념을 통해 중요한 정보는 서버에서 관리하고 클라이언트에게는 세션쿠키(sessionID)를 주어 식별이 가능하도록 한것이다.
결론적으로 사전적 의미를 보면 세션(통신을 시작하고 마칠때 까지의 기간)을 유지하기 위해 쿠키를 사용하는 것인데, 용어상으로는 세션이란 서버에 정보를 저장하고 세션 쿠키를 통해 클라이언트를 식별하는 방식을 통틀어 말하는 것으로 보면 되겠다.