[Network] HTTP 쿠키와 세션
- [ CS기초 ]/네트워크
- 2022. 2. 3.
개요
HTTP 프로토콜은 stateless라는 특징을 갖는다. stateless(무상태)란 상태가 존재하지 않는다는 의미이다. stateless한 서버 입장에서는 동일한 클라이언트의 요청이라도 각 요청을 독립적으로 관리한다. 즉, 동일한 클라이언트가 다시 요청을 하더라도 서버는 이전의 요청을 기억하지 못하며, 이는 인증(Authentication)이 필요한 요청에 문제가 될 수 있다.
이러한 단점을 쿠키 없이 해결하기 위해서는 모든 요청에 사용자 정보를 포함하여 전송하면 된다. 하지만 모든 요청에 사용자 정보를 포함한다면 개발의 불편함과 보안상의 문제가 존재하기 때문에, 쿠키와 세션을 사용하여 이러한 문제를 해결한다.
쿠키
쿠키란 HTTP의 stateless라는 특징에서 벗어나 상태를 유지하기 위한 장치라고 보면 된다. 처음 사용자 인증이 완료되면 서버는 클라이언트에 쿠키를 만들어서 보내주고, 클라이언트는 쿠키 저장소에 쿠키를 저장한다. 이후에 클라이언트가 해당 서버에 접근할 때마다 쿠키 저장소를 검색해서 보낼 쿠키가 있는지를 확인하고, 유효한 쿠키가 있다면 헤더에 쿠키정보를 추가해서 서버로 보낸다.
하지만 쿠키를 사용하지 않을 때와 비슷하게, 모든 요청 헤더에 쿠키를 포함하여 전송하는 것 역시 보안상의 문제가 존재한다. 그래서 서버에서는 세션 키를 이용한다.
쿠키와 세션
클라이언트가 서버에 요청을 보내면, 서버는 쿠키 대신 세션 ID를 생성하고 그 세션키를 클라이언트에 반환해준다. 그러면 동일한 클라이언트의 재요청이 이루어질 때마다 서버는 클라이언트가 보내주는, 세션키가 포함된 세션 쿠키를 이용해서 클라이언트를 인증할 수 있게 된다. 일종의 password역할을 하는 것이다. 이렇게 되면 세션 쿠키가 노출되더라도 쿠키만 사용하는 경우에 발생할 수 있는 '클라이언트의 정보가 직접 노출될' 위험성은 없어지게 된다.
다만 쿠키 세션의 경우 서버에서 세션을 관리해야 한다는 문제가 있고, 보안 취약점이 있기 때문에 토큰 기반 로그인과 같은 다른 방법들이 사용된다.
쿠키 헤더
쿠키 사용을 위해서는 크게 두가지의 헤더가 사용된다.
Set-Cookie -> 서버에서 클라이언트로 쿠키를 전달한다.
Cookie -> 클라이언트가 서버에서 받은 쿠키를 저장했다가 요청시에 서버로 전달한다.
먼저 Set-Cookie에는 어떤 정보들이 있는지 확인해보자.
<Expires/Max-Age>
서버에서 지정한 만료일이나 시간이 지나면 쿠키가 삭제되도록 할 수 있다.
Set-Cookie: expires = Thu,03-2022 01:02:03 GMT //만료일이 지나면 쿠키 삭제
Set-Cookie: max-age=3600 //3600초동안 유지
세션 쿠키 : 만료 날짜가 생략되면 브라우저 종료시까지 유지된다.
영속 쿠키 : 만료 날짜가 입력되면 해당 날짜까지 유지된다.
<Domain>
도메인이 명시되면 명시된 도메인과 그 서브 도메인을 포함하여 쿠키가 유효하다.
<Path>
path속성에 기술된 값이 URL경로의 앞부분과 일치하면 쿠키를 전송한다. 만약 경로를 명시하지 않으면 Set-Cookie응답을 전달하는 URL의 경로가 사용된다. (동일하거나 하위 경로만 전송한다)
<Secure, HttpOnly, SameSite>
보안과 관련된 헤더들이다. Secure가 적용되면 https인 경우에만 쿠키를 전송한다. HttpOnly는 XSS공격을 방지하기 위한 기능이고, SameSite는 XSRF공격을 방지하기 위해 요청 도메인과 쿠키의 도메인이 같은 경우에만 쿠키를 전송한다.
'[ CS기초 ] > 네트워크' 카테고리의 다른 글
[Network] UDP, TCP (0) | 2022.02.15 |
---|---|
[Network] Transport Layer (0) | 2022.02.11 |
[Network] 웹과 HTTP (0) | 2022.02.08 |
[Network] Application Layer - 소켓, 프로토콜과 DNS (0) | 2022.02.01 |
[Network] 컴퓨터 네트워크 (0) | 2022.01.29 |