Cookie, Session

JUN·2021년 4월 17일
0
post-custom-banner

쿠키는 서버에서 클라이언트에 데이터를 저장하는 방법의 하나입니다.
그러므로 서버가 원한다면 서버는 클라이언트에서 쿠키를 이용하여 데이터를 가져올 수 있습니다.
그러므로 쿠키를 이용하는 것은 단순히 서버에서 클라이언트에 쿠키를 전송하는 것만 의미하지 않고 클라이언트에서 서버로 쿠키를 전송하는 것도 포함됩니다.

쿠키는 서버가 클라이언트에 데이터를 저장할 수 있다는 특징이 있습니다.

서버는 쿠키를 이용하여 데이터를 저장하고 원할 때 이 데이터를 다시 불러와 사용할 수 있습니다.
하지만 데이터를 저장한 이후 아무 때나 데이터를 가져올 수 없습니다. 데이터를 저장한 이후 특정 조건들이 만족하는 경우에만 다시 가져올 수 있습니다.

이런 조건들을 쿠키 옵션으로 포현할 수 있습니다.

1. Domain

2. Path

3. MaxAge or Expires

4. Secure

5. HttpOnly

6. SameSite



쿠키를 이용한 상태유지


쿠키의 특성을 이용하여 서버는 클라이언트에 인증정보를 담은 쿠키를 전송하고, 클라이언트는 전달받은 쿠키를 요청과 같이 전송하여 Stateless한 인터넷 연결을 Stateful하게 유지할 수 있습니다.

하지만 기본적으로 쿠키는 오랜 시간 동안 유지될 수 있고, 자바스크립트를 이용해서 쿠키에 접근할 수 있기 때문에 쿠기에 민감한 정보를 담는 것은 위험합니다.
이런 인증정보를 탈취하여 서버에 요청을 보낸다면 서버는 누가 요청을 보낸건지 상관하지 않고 인증된 유저의 요청으로 취급하기 때문에, 개인 유저 정보 같은 민감한 정보에 접근이 가능합니다.

Session

Session은 데이터를 서버에 저장하는 방식이다.
서버가 Client에 유일하고 암호환된 ID를 부여

로그인


위의 그림은 로그인을 통해 인증정보가 저장되고, 인증된 사용자가 어떤 식으로 웹사이트를 이용하는지에 대한 과정을 보여주고 있습니다.

  1. 사용자가 웹 사이트에서 아이디 및 비밀번호를 이용해서 로그인을 시도.
  2. 사용자가 인증에 성공한 상태는 세션이라고 부릅니다. 서버는 일종의 저장소에 세션을 저장합니다. 주로 in-memory(자바스크립트 객체를 생각하면 됩니다), 또는 세션 스토어(redis 등과 같은 트랜잭션이 빠른 DB)에 저장합니다.
  3. 세션이 만들어지면, 각 세션을 구분할 수 있는 세션 아이디도 만들어집니다.
  4. 보통 클라이언트에 세션 성공을 증명할 수단으로서 세션 아이디를 전달합니다.

이때에 웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용합니다. 쿠키에는 서버에서 발급한 세션 아이디를 저장합니다.

  1. 쿠키를 통해 유효한 세션아이디가 서버에 전달됩니다.
  2. 세션 스토어에 해당 세션이 존재하는지 확인합니다.
  3. 8.서버는 해당 요청에 접근 가능하다고 판단하고 해당 요청 사항을 받아들여 줍니다.

하지만 쿠키에 세션 아이디 정보가 없는 경우, 서버는 해당 요청이 인증되지 않았음을 알려줍니다.

로그아웃


세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있으며, 서버는 세션을 저장하고 있습니다. 서버는 그저 세션 아이디로만 요청을 판단합니다.

* 주의

쿠키는 세션 아이디, 즉 인증 성공에 대한 증명을 갖고 있으므로, 탈취될 경우 서버는 해당 요청이 인증된 사용자의 요청이라고 판단합니다.

이러한 이유 때문에, 우리가 공공 PC에서 로그아웃을 해야 하는 이유입니다.

로그아웃은 다음의 두가지 작업을 해야한다.

  • 서버의 세션 정보를 삭제해야 한다.
  • 클라이언트의 쿠키를 갱신해야 한다.

서버가 클라이언트의 쿠키를 임의로 삭제할 수는 없습니다. 대신, set-cookie로 세션 아이디의 키값을 무효한 값으로 갱신해야 합니다.

Session 단점

서버의 메모리에 세션 정보를 저장하고 있습니다.
만약에 서버의 이용자가 매우 많은 경우라면, 메모리 저장공간의 일정 부분을 항상 차지하게 되므로 가용 메모리의 양이 줄어들어서 서버의 성능이 안좋아지는 결과가 발생하게 된다.

또한 세션은 기존 쿠키를 완전히 대체하게 된것이 아니기 때문에 여전히 쿠키를 사용하고 있다. httpOnly 옵션이 없는 경우에 쿠키는 악의적인 스크립트 공격 즉, XSS 공격에 매우 취약하다. 세션 역시 쿠키를 이용하기 때문에 쿠키의 한계를 그대로 가지고 있습니다. 만약에 세션ID정보가 담긴 쿠키가 탈취된다면 개인정보가 유출될 위험이 존재한다. 그래서 공공장소에선 꼭! 로그아웃을 해줘야 한다.


profile
Developer
post-custom-banner

0개의 댓글