쿠키는 서버에서 클라이언트에 데이터를 저장하는 방법의 하나입니다.
그러므로 서버가 원한다면 서버는 클라이언트에서 쿠키를 이용하여 데이터를 가져올 수 있습니다.
그러므로 쿠키를 이용하는 것은 단순히 서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 클라이언트에서 서버로 쿠키를 전송하는 것도 포함됩니다.
서버는 쿠키를 이용하여 데이터를 저장하고 원할 때 이 데이터를 다시 불러와 사용할 수 있습니다.
하지만 데이터를 저장한 이후 아무 때나 데이터를 가져올 수 없습니다. 데이터를 저장한 이후 특정 조건들이 만족하는 경우에만 다시 가져올 수 있습니다.
이런 조건들을 쿠키 옵션으로 포현할 수 있습니다.
하지만 기본적으로 쿠키는 오랜 시간 동안 유지될 수 있고, 자바스크립트를 이용해서 쿠키에 접근할 수 있기 때문에 쿠기에 민감한 정보를 담는 것은 위험합니다.
이런 인증정보를 탈취하여 서버에 요청을 보낸다면 서버는 누가 요청을 보낸건지 상관하지 않고 인증된 유저의 요청으로 취급하기 때문에, 개인 유저 정보 같은 민감한 정보에 접근이 가능합니다.
Session은 데이터를 서버에 저장하는 방식이다.
서버가 Client에 유일하고 암호환된 ID를 부여
위의 그림은 로그인을 통해 인증정보가 저장되고, 인증된 사용자가 어떤 식으로 웹사이트를 이용하는지에 대한 과정을 보여주고 있습니다.
이때에 웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용합니다. 쿠키에는 서버에서 발급한 세션 아이디를 저장합니다.
하지만 쿠키에 세션 아이디 정보가 없는 경우, 서버는 해당 요청이 인증되지 않았음을 알려줍니다.
* 주의
쿠키는 세션 아이디, 즉 인증 성공에 대한 증명을 갖고 있으므로, 탈취될 경우 서버는 해당 요청이 인증된 사용자의 요청이라고 판단합니다.이러한 이유 때문에, 우리가 공공 PC에서 로그아웃을 해야 하는 이유입니다.
로그아웃은 다음의 두가지 작업을 해야한다.
서버가 클라이언트의 쿠키를 임의로 삭제할 수는 없습니다. 대신, set-cookie로 세션 아이디의 키값을 무효한 값으로 갱신해야 합니다.
서버의 메모리에 세션 정보를 저장하고 있습니다.
만약에 서버의 이용자가 매우 많은 경우라면, 메모리 저장공간의 일정 부분을 항상 차지하게 되므로 가용 메모리의 양이 줄어들어서 서버의 성능이 안좋아지는 결과가 발생하게 된다.
또한 세션은 기존 쿠키를 완전히 대체하게 된것이 아니기 때문에 여전히 쿠키를 사용하고 있다. httpOnly 옵션이 없는 경우에 쿠키는 악의적인 스크립트 공격 즉, XSS 공격에 매우 취약하다. 세션 역시 쿠키를 이용하기 때문에 쿠키의 한계를 그대로 가지고 있습니다. 만약에 세션ID정보가 담긴 쿠키가 탈취된다면 개인정보가 유출될 위험이 존재한다. 그래서 공공장소에선 꼭! 로그아웃을 해줘야 한다.