HTTP 프로토콜은 비연결지향(Connectionless), 상태정보 유지안함(Stateless) 특성 때문에 서버는 통신할 때마다 클라이언트가 누구인지 인증을 해야 한다.
비연결지향(Connectionless)
클라이언트가 요청한 후 응답을 받으면 그 연결을 끊는다.
상태정보 유지 안함(Stateless)
통신이 끝나면 상태를 유지하지 않는다.
쿠팡에서 물건을 사려고 최초 로그인을 해도 서버는 클라이언트가 누군지 기억하지 않기 때문에 페이지를 이동할 때마다 로그인을 해야 하는데, 이를 해결하기 위해 쿠키와 세션을 사용하게 된다.
서버에서 클라이언트로 쿠키 발급 시 Set-Cookie 헤더에 의해 클라이언트 쿠키값이 세팅이 되고 해당 사이트 접근 시마다 클라이언트는 Set-Cookie에 의해 세팅된 값을 Cookie 헤더에 세팅하여 요청 메시지를 전달한다. 서버는 이를 통해 상태 관리를 한다.
* Set-Cookie 헤더 구조
Set-Cookie: name=value [; expires=date] [; path=path] [; domain=domain] [; secure]
* Cookie 헤더 구조
Cookie: name1=value1 [; name2=value2] [; name3=value3]
아이디 패스워드 입력 후 로그인 요청을 한다.
로그인이 정상적으로 이루어지면 Set-Cookie 헤더에 의해 쿠키 값이 세팅이 된다. (id=hong123 등)
홍길동이 B 사이트에 다시 접근하게 되면 웹 브라우저에서는 해당 사이트에 대한 쿠키값을 Cookie 헤더에 세팅한다. 웹 어플리케이션 서버는 이를 통해 사용자 식별을 한다.
로그아웃 요청이 오면 웹 어플리케이션 서버에서는 Set-Cookie 헤더에 삭제할 값을 입력한다. 그 결과 사이트 B에 대한 쿠키 정보는 사라지게 된다.
세션이 보안 측면에서 좋은데 왜 쿠키를 사용할까?
-> 대규모 웹 서비스의 경우 수많은 사용자들의 세션을 관리하기에는 서버에 엄청난 부하를 가져오기 때문에 서버에 부담이 낮은 쿠키 사용을 선호한다.