[HTTP] 쿠키와 세션

쿠키

쿠키(cookie)란 서버에서 생성하고 클라이언트에 전송하는 정보이다. 서버가 클라언트에게 전송하는 Set-cookie 응답 헤더 기반으로 클라이언트의 로컬 저장소에 쿠키 데이터를 저장한다. Set-cookie 응답 헤더에 쿠키명과 값을 지정한다.

Set-cookie: 쿠키명=쿠키값


클라이언트는 동일한 서버에 요청 시 저장된 쿠키 데이터를 읽어 요청 헤더에 설정하여 서버에 전송한다. Cookie 요청 헤더에 쿠키명과 값을 지정한다.

Cookie: 쿠키명=쿠키값


HTTP는 상태 비저장(stateless) 기반이지만 쿠키를 사용하면 서버가 클라이언트의 상태를 유지하는 상태 저장(stateful) 서비스를 제공할 수 있다. 서버는 클라이언트에 데이터를 저장하고 다음 요청 시 클라이언트가 해당 데이터를 다시 보내도록 함으로써 클라이언트의 상태를 식별할 수 있다.

쿠키를 사용하면 서버 측에 클라이언트의 데이터를 저장하는 대신 클라이언트에 데이터를 저장할 수 있으며 이 경우 안전한 데이터 보관을 위해 쿠키 데이터의 암호화(서명된 쿠키)가 필요한다.

쿠키 사용 시 주의사항은 다음과 같다.

  • 쿠키는 클라이언트의 설정 및 환경에 따라 언제든지 삭제될 수 있다.
  • 암호화되지 않은 통신에서 쿠키는 평문으로 전송되어 그대로 노출될 수 있다.


세션

세션(session)은 쿠키를 기반으로 클라이언트 및 클라이언트가 전송한 데이터를 식별하기 위한 방법이다. 웹 서버에서 세션은 주로 클라이언트의 서버에 대한 인증(authorization)을 위해 사용된다. 세션을 사용하여 클라이언트의 인증이 완료되었을 때 이후 동일한 클라이언트의 요청 시 추가적인 인증이 필요 없도록 만들 수 있다.


클라이언트 사이드 세션

클라이언트의 인증 요청이 정상적으로 처리되면 서버는 세션을 식별하기 위한 세션 토큰(session token) 또는 세션 아이디(session id)를 생성하고 데이터베이스에 저장한 후 해당 토큰을 쿠키로 클라이언트에게 전송한다. 클라이언트는 인증 정보가 포함된 요청 시 해당 쿠키를 헤더로 전송함으로써 인증이 완료된 클라이언트임을 서버에게 알려준다.


서명된 쿠키를 이용한 세션 관리

세션도 쿠키 기반이므로 클라이언트에 저장된 세션 관련 쿠키에 대한 위조 취약점이 존재한다. 서버는 전자 서명된 쿠키 데이터(암호화된 세션 데이터)를 클라이언트에 전송하고, 클라이언트가 이를 다시 서버에 전송하도록 함으로써 쿠키의 위조를 막을 수 있다. 세션 관리를 위해 세션 데이터를 서버 측에서 영속화했던 기존 방법과 달리 전자 서명된 쿠키를 사용하여 세션 데이터를 저장하므로 서버에 세션 관련 데이터를 저장할 필요가 없다는 장점이 있다. 세션 데이터의 암복호화에 필요한 공개키 및 비밀키 모두 서버에 존재하므로 클라이언트에 저장된 데이터의 위조는 불가능하다.


고정 세션

로드 밸런싱에 의해 클라이언트의 요청이 독립적으로 분산되어 서버(스테이트풀, 상태 저장)로 전달되고, 하나의 클라이언트가 비즈니스 처리를 위해 여러 요청을 보내야 하는 상황이라면 클라이언트의 분리된 여러 요청들은 하나의 서버로 전달됨으로써 연속적으로 처리되어야 한다.

고정 세션은 로드 밸런서가 서버에 저장된 클라이언트의 세션 정보를 클라이언트와 연결시켜 동일한 세션에 대해서는 클라이언트의 모든 요청이 동일한 서버로 전송될 수 있도록 한다. 고정 세션 기능은 클라이언트에게 지속적인 경험을 제공하기 위해 상태 정보를 유지하는 서버에 유용하다.


참고

Comments