WEEK 6-7: Spring Cookie

ensalada.de.pollo·2025년 5월 18일

be

목록 보기
29/44

Cookie

Cookie는 웹 서버가 사용자의 브라우저에 저장하는 작은 데이터 조각입니다. 주로 사용자의 로그인 상태, 세션 유지, 사용자 맞춤 설정, 트래킹 등의 상태 정보를 저장하며, HTTP의 stateless 한계를 보완합니다.

사용하는 이유

  • HTTP는 Stateless와 Connectionless 라는 특징을 가지고 있습니다.
    서버는 각 요청이 독립적이기 때문에 이전에 요청했던 정보를 기억하지 못합니다. 그렇기 때문에, 사용자가 로그인한 상태를 유지하거나 세션 정보를 저장하려면 별도의 방법이 필요합니다.

  • 쿠키를 활용하면?
    로그인 성공시 서버가 set-cookie 헤더로 세션 id 등의 정보를 브라우저에 저장합니다. 이후 모든 요청에 쿠키가 자동으로 포함되어 서버가 사용자를 식별할 수 있도록 합니다. 여기서, 브라우저를 닫았다가 다시 열어도 쿠키가 남아있으면 사용자를 기억할 수 있습니다.

그러면 그냥 브라우저에 데이터를 저장하기만 하면 되는 것 아닌가요?

단순히 브라우저에 데이터를 저장하기 위해서 localStorage와 sessinStorage 등 Web Storage 등을 사용할 수는 있습니다. 하지만, 서버에 자동으로 전송되지도 않고 보안에 더 취약합니다.

동작 방식

브라우저에서 쿠키 확인

개발자 도구(F12) -> Application -> Cookies 에서 확인이 가능합니다.

저장 및 전송 흐름

서버가 HTTP 응답 헤더에 Set-Cookie를 포함하여 쿠키를 생성합니다.
Set-Cookie: sessionId=abcd; expires= Sat, 11-Dec-2024 00:00:00: GMT;

브라우저가 저장한 쿠키를 이후 요청의 Cookie 헤더에 자동 포함합니다.
Cookie: sessionId=abcd;

로그인 후 세션 id를 쿠키에 저장, 이후 요청마다 인증 및 인가에 활용하게 됩니다.

종류와 속성

속성특징
Session Cookie만료일 미설정, 브라우저 종료 시 삭제됨
Persistent Cookie만료일 설정, 브라우저 종료 후에도 지정 시점까지 유지
Domain쿠키가 적용될 도메인 지정, 서브도메인까지 적용 가능
Path쿠키가 적용될 URL 경로 지정, 예를 들어 /api로 지정하면 하위 경로만 쿠키 포함
SecureHTTPS 연결에서만 쿠키를 전송, 평문 HTTP에서는 전송이 되지 않음
HttpOnlyjavascript에서 쿠키 접근이 불가, XSS 공격 방어 기법 중 하나로 속함
Samesitecross-site 요청 시 쿠키 전송 제한, CSRF 등 보안 강화

주의

쿠키는 모든 요청에 자동 포함이 되기 때문에 트래픽이 증가할 수 있습니다. 따라서 최소한의 정보만을 저장해야 합니다.

예시

Cookie의 주요 활용 목적은 사용자의 세션관리라고 하였습니다. 또한 광고 트래킹과 같은 사용자의 행동을 담는 목적도 있습니다.

로그인/로그아웃 구현 예시

요구사항
1. 로그인한 회원만 home 페이지 접근 가능
2. 로그인하지 않으면 login 페이지 이동
3. 브라우저 종료 시 자동 로그아웃

핵심 코드 흐름
로그인을 성공하면, userId 등을 담고 있는 Cookie 객체를 생성하고, 요구사항에 맞게 세션 Cookie를 사용할지 영속 Cookie를 사용할지(만료시간 지정여부) 정하게 됩니다. 그리고 HttpServletResponse.addCookie()로 응답에 쿠키를 추가하고, 이후 모든 요청에 쿠키가 자동 포함되어 전달됩니다.

로그아웃을 하게 되면 동일이름의 쿠키를 null값과 등등의 설정을 거쳐 만료시킵니다. 그런 다음, 응답에 만료된 쿠키를 추가하여 브라우저에서 삭제시킵니다.

컨트롤러에서 쿠키를 사용할 때에는 @CookieValue(name = "userId", required = false)로 쿠키 값을 조회합니다. 만약 쿠키가 없거나 DB에 해당 유저가 존재하지 않으면 로그인 페이지로 이동합니다. 정상적인 요청이라면, model에 추가하여 홈 화면을 렌더링 합니다.

문제점

  1. 쿠키 값을 임의로 변경할 수 있습니다.
    사용자가 브라우저 개발자 도구에서 쿠키 값을 직접 수정할 수 있스빈다. 서버는 쿠키의 값만 보고 사용자를 식별하기 때문에, 값이 변조되면 다른 사용자로 오인식합니다.

  2. 쿠키 데이터 탈취 위험
    네트워크 전송 중 쿠키가 탈취될 수 있습니다. 특히나 HTTP 환경은 요청과 응답이 평문으로 이루어지기 때문에 탈취될 위험성이 더 높아집니다. 그리고 쿠키에는 사용자에 대한 정보를 저장한다고 했는데, 민감한 정보를 저장하면 위험해지고, 탈취된 쿠키는 만료 전까지 계속 사용할 수 있기 때문에 보안적으로 문제가 존재합니다.

대처 방법

  • 쿠키에 민감한 정보를 저장하지 않아야 합니다.
  • 식별자는 암호화된 토큰 등으로 대체해야 합니다.
  • 토큰 만료 시간을 짧게 설정해야 합니다.
  • 기기 또는 위치가 변경될 시 토큰을 강제 만료 처리합니다.

자료 및 코드 출처: 스파르타 코딩클럽

0개의 댓글