Cookie

전현진·2025년 4월 3일

Spring

목록 보기
9/14

1. Cookie

사용자의 웹 브라우저에 저장되는 정보로 사용자의 상태 혹은 세션을 유지하거나 사용자 경험을 개선하기 위해 사용된다.

로그인 성공시 응답

  • 로그인시 전달된 ID, Password로 User 테이블 조회하여 일치여부 확인

  • 일치한다면 Set-Cookie를 활용해 Cookie에 사용할 값 저장

    • Cookie는 보안에 취약하다.

로그인 이후 요청

  • 로그인 이후에는 모든 요청마다 Request Header에 항상 Cookie 값을 담아서 요청한다.

    • 네트워크 트래픽이 추가적으로 발생된다.

    • 최소한의 정보만 사용해야한다.

  • Cookie에 담겨있는 값으로 인증/인가 를 진행한다.


  1. Set-Cookie
    • Server에서 Client로 Cookie 전달(Response Header)
  2. Cookie
    • Client가 Cookie를 저장하고 HTTP 요청시 Server로 전달(Request Header)

Cookie의 생명주기

  1. 세션 Cookie
  • 만료 날짜를 생략하면 브라우저 완전 종료시 까지만 유지된다.(Default)
    • expires, max-age 가 생략된 경우
  • 브라우저를 완전 종료 후 다시 페이지를 방문했을 때 다시 로그인을 해야한다.
  1. 영속 Cookie
  • 만료 날짜를 입력하면 해당 날짜까지 유지한다.
    • expires=Sat, 11-Dec-2024 00:00:00 GMT;
      • 해당 만료일이 도래하면 쿠키가 삭제된다.
    • max-age=3600 (second, 3600초는 한시간. 60 * 60)
      • 0이 되거나 음수를 지정하면 쿠키가 삭제된다.

Cookie의 도메인

  • 쿠키가 아무 사이트에서나 생기고 동작하면 안된다!
    • 필요없는 값 전송, 트래픽 문제 등이 발생한다.
  • domain=spartacodingclub.kr
    • domain=spartacodingclub.kr를 지정하여 쿠키를 저장한다.
    • dev.spartacodingclub.kr와 같은 서브 도메인에서도 쿠키에 접근한다.
  • domain을 생략하면 현재 문서 기준 도메인만 적용한다.

Cookie의 경로

  • 1차적으로 도메인으로 필터링 후 Path가 적용된다.
  • 일반적으로 path=/ 루트(전체)로 지정한다.
  • 위 경로를 포함한 하위 경로 페이지만 쿠키에 접근한다.
  • path=/api 지정
    • path=/api/example 가능
    • path=/example 불가능

  1. Secure
  • 기본적으로 Cookie는 http, https 구분하지 않고 전송한다.
  • Secure를 적용하면 https인 경우에만 전송한다. s = Secure
  1. HttpOnly
  • XSS(Cross-site Scripting) 공격을 방지한다.
    • 악성 스크립트를 웹 페이지에 삽입하여 다른 사용자의 브라우저에서 실행되도록 하는 공격
  • 자바스크립트에서 Cookie 접근을 못하도록 막는다.
  • HTTP 요청시 사용한다.
  1. SameSite
  • 비교적 최신 기능이라 브라우저 지원여부를 확인 해야한다.
  • CSRF(Cross-Site Request Forgery) 공격을 방지한다.
    • 사용자가 의도하지 않은 상태에서 특정 요청을 서버에 전송하게 하여 사용자 계정에서 원치 않는 행동을 하게 만든다.
  • 요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송

  • 한번 로그인에 성공하면 HTTP Response에 쿠키를 담아서 브라우저에 전달한다.
  • 브라우저는 요청마다 Cookie를 함께 전송한다.
  • 보안상의 문제로 name=원욱이 아닌 userId=1과 같은 index 정보를 저장한다.
    • 이것 또한 보안문제가 있다.
  • 요구사항에 맞추어 세션 Cookie를 사용할지 영속 Cookie를 사용할지 결정한다.

Cookie는 보안에 취약하여 userId=1 형태의 방식으로 로그인을 구현하지 않는다.

  1. 쿠키 값은 임의로 변경할 수 있다.
    • Client가 임의로 쿠키의 값을 변경하면 서버는 다른 유저로 인식한다.
    • 브라우저 개발자도구(F12) → Application → Cookies → 값 수정 가능
    • 실제로는 암호화되어 저장되어있는 Value들을 볼 수 있다!
  2. Cookie에 저장된 Data는 탈취되기 쉽다.
    • userId = 주민번호, userId = 인덱스 값
    • 쿠키는 네트워크 전송 구간에서 탈취될 확률이 매우 높다.
      • HTTPS를 사용하는 이유 중 하나에 속한다.
      • 민감한 정보를 저장하면 안된다.
    • 한번 탈취된 정보는 변경이 없다면 반영구적으로 사용할 수 있다.

보안 대처방법

  1. 쿠키에 중요한값을 저장하지 않는다.
  2. 사용자 별로 일반 유저나 해커들이 알아보지 못하는 값을 노출한다.
    • 일반적으로 암호화된 Token을 쿠키에 저장한다.
    • 서버에서 암호화된 Token과 사용자를 매핑해서 인식한다.
    • Token은 서버에서 관리한다.
  3. 토큰은 해커가 임의의 값을 넣어도 동작하지 않도록 만들어야 한다.
  4. 해커가 토큰을 탈취해도 사용할 수 없도록 토큰 만료시간을 짧게 설정한다.
  5. 탈취가 의심되는 경우 해당 토큰을 강제로 만료시키면 된다.
    • 접속기기 혹은 IP가 다른 경우 등
profile
안녕하세요

0개의 댓글