쿠키와 세션

개나뇽·2024년 2월 10일
0

개요

현재 혼자 진행중인 프로젝트는 토큰 방식의 로그인이 아닌 세션 로그인 방식을 사용하고 있습니다.

해당 포스팅에서는 세션에 대해서 알아보고 또 세션을 공부하기전에 알아야하는 쿠키에 대해서도 정리해보려고 합니다.

쿠키의 탄생 배경

우리가 사용하는 http는 Statless 프로토콜입니다. Statless의 특징으로는 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어지며, 이때 클라이언트가 재요청을 하면 서버는 이전 요청을 기억하지 못합니다.

즉 예를들어 쿠키를 사용하지 않는 서비스에서 Da-you라는 유저가 로그인 요청을 보내고 서버에서 응답을 받고 다시 요청을 보내면 서비스에서는 현재 요청을 준 사용자가 누구인지 알지 못하는 상황이 발생합니다.

이에 대한 대안으로 나온것이 쿠키입니다.

쿠키의 동작 방식

웹 브라우저에서 로그인 요청을 보냅니다. 그럼 요청을 받은 서버는 받은 데이터를 "Set-Cookie": user=Da-you 데이터를 쿠키 헤더라는 것을 생성하여 응답합니다.

웹브라우저 내부에는 쿠키 저장소가 별도로 존재하는데 이 저장소에 user=Da-you를 저장합니다.

그 후 웹브라우저는 서버에 요청을 보낼때마다 자동으로 쿠키를 찾아서 "Cookile"라는 헤더에 쿠키값을 넣어 서버에 보내주고 서버는 쿠키를 받아서 쿠키를 열어 값을 확인합니다.

  • Set-Cookie : 서버에서 클라이언트로 쿠키 전달(응답)

    Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP요청시 서버로 전달

쿠키의 특징

  • 사용처 :

1.사용자의 로그인 세션 관리

  1. 광고 정보 트레킹
  • 쿠키 정보는 항상 서버에 전송된다.
  1. 네트워크 트래픽의 추가 유발

  2. 최소한의 정보만 사용해야 한다(ex: 세션id, 인증 토큰)

  3. 서버에 전송하지 않고 웹 브라우저 내부에 데이터를 저장하고자 한다면 웹 스토리지를 참고하시면 될거같습니다.

-주의 사항

  1. 보안에 민감한 데이터는 저장하면 절대! 안됩니다.

*위 특징들 이외에도 쿠키에는 도메인을 적거나, 경로를 설정하여 해당 경로를 포함한 하위 경로 페이지만 쿠키를 접근 시키는 방법또한 존해하며 Secure를 이용해 Https인 경우에만 쿠키를 전송하거나 HttpOnly를 사용해 Xss 공격 방지, 자바스크립에서는 접근을 못하게 하거나 HTTP 전송에만 사용하는등 보안 기능의 특징이 있습니다.

쿠키의 생명주기

쿠키의 생명주기로 "세션 쿠키"와 "영속 쿠키"가 있습니다.

"세션 쿠키"는 만료 날짜를 생략하면 브라우저 종료시 까지만 유지를 합니다.

"영속 쿠키"는 만료 날짜를 입력하면 해당 날짜까지 유지를 합니다.

세션의 등장 배경

우리가 알아본 쿠키에는 보안에 크나큰 문제점이 몇가지 있습니다.

  1. 쿠키의 값을 임의로 변경이 가능하여 클라이언트가 쿠키를 강제로 변경하여 다른 사용자가 되는것도 가능합니다.

ex: 실제 웹브라우저 개발자 모드 > Application > Cookie: loginId=1을 Cookie: loginId=2로 변경시 다른 사용자의 이름이 보입니다.

  1. 쿠키에 보관된 정보는 훔쳐갈 수 있습니다.

이 문제점 떄문에 쿠키에는 사용자의 민감한 정보를 넣지 않아야 한다고 주의를 하였습니다!

  1. 해커가 쿠키를 한번 훔쳐가면 평생 사용이 가능합니다.

위 문제점들에 대한 대안으로는

  1. 쿠키에 중요한 값을 노출하지 않으며 사용자 별로 예측이 불가능한 랜덤한 토큰 값을 대신 노출하며 이를 서버에서 사용자 id와 매핑하여 인식합니다. 그리고 토큰은 서버에서 관리를 합니다.(클라이언트가 보관하는것을 위험합니다.)

  2. 토큰을 예측이 불가능한 값이어야합니다.

  3. 위 두개의 방법을 이용해도 아직 위험할수가 있기에 토큰의 만료시간을 설정(짧게)하여 유효시간이 지나면 사용이 불가능하게 합니다. 또는 해킹이 의심되는 경우 서버에서 토큰을 강제로 제거합니다.

세션 동작 방식

클라이언트가 서버에 id, password 정보를 전달하면 서버에서 이를 db에서 해당 사용자가 맞는지 확인합니다. 이때 서버에서 세션 저장소를 만들어서 관리를 해야합니다. 그리고 토큰을 생성해줘야하는데 토큰을 예측이 불가능한 랜덤한 값이어야 하므로 UUID를 주로 사용합니다. 여기서 임의로 만들어진 토큰을 세션 저장소의 key값이 되며 value는 회원객체로 저장합니다.

이후에 서버와 웹브라우저의 연결을 유지하기 위해서 웹브라우저에서는 결국 쿠키를 사용하여 요청을 보내하는데 이때 쿠키 값에는 회원정보가 아닌 세션 저장소의 key값을 넘겨주고 클라이언트는 쿠키 저장소에 key값을 저장합니다. 이렇게 되면 이제 클라이언트를 서버에 요청할때마다 토큰값을 서버에 전달하며 서버에서는 토큰값을 세션 저장소에서 조회하여 로그인시 보관한 value인 회원정보를 사용합니다.

profile
정신차려 이 각박한 세상속에서!!!

0개의 댓글

관련 채용 정보