727. XSS 방어 HttpOnly 쿠키 속성 설정 원리 스크립트 접근 차단

핵심 인사이트: XSS 공격을 하는 해커의 가장 큰 목표는 사용자의 컴퓨터 브라우저 안에 구워져 있는 '로그인 통행증(세션 쿠키)'을 훔쳐 가는 것이다. 해커는 자바스크립트 명령어를 몰래 삽입해 "쿠키 내놔!"라고 시킨다. 이 해커의 빨대를 원천 차단하는 궁극의 백신이 바로 'HttpOnly'다. "내 쿠키는 오직 브라우저 엔진만 만질 수 있고, 그 어떤 자바스크립트 코드도 절대 건드리지 마라!"라고 철벽을 치는 방어 기술이다.

Ⅰ. XSS 공격이 쿠키를 훔치는 원리

  • 앞선 726번 문서에서, 해커가 성공적으로 웹사이트에 악성 자바스크립트 코드(<script> ... </script>)를 심어두면, 접속한 사용자의 브라우저에서 이 코드가 실행됩니다.
  • 이때 해커의 코드는 자바스크립트의 기본 기능인 **document.cookie**라는 내장 명령어를 딱 한 줄만 실행합니다. 이 명령어가 실행되면 현재 브라우저에 저장된 내 네이버 아이디 세션 쿠키, 은행 인증 쿠키가 텍스트 형태로 툭 튀어나옵니다. 해커는 이걸 자기 서버로 쓱 날려버리면 끝입니다(세션 하이재킹).

Ⅱ. 1차 방어: 입력값 필터링 (가장 기본)

가장 근본적으로는 개발자가 꼼꼼해야 합니다.

  • 입력값 검증(Validation): 사용자가 게시판에 글을 쓸 때 꺾쇠 괄호 <> 같은 특수문자를 아예 못 쓰게 막아버립니다.
  • HTML 인코딩 (치환): 사용자가 억지로 <script>라고 치면, 서버는 이를 &lt;script&gt; 같은 무의미한 텍스트 기호로 싹 다 강제 변환해서 DB에 저장합니다. 나중에 다른 사람이 그 글을 봐도 브라우저는 이를 실행 코드가 아닌 단순한 "글자"로 인식해 악성 행위가 차단됩니다. (보안 코딩의 기초)

Ⅲ. 2차 완벽 방어: HttpOnly 속성 부여 🌟

만약 개발자가 실수로 필터링을 빼먹어서 악성 자바스크립트가 내 화면에서 실행되어 버렸다면? 그래도 내 쿠키를 지켜주는 최후의 안전장치가 바로 HttpOnly입니다.

1. HttpOnly의 동작 원리

  • 웹 서버(네이버 등)가 로그인에 성공한 사용자에게 임시 통행증인 세션 쿠키를 구워줄 때, HTTP 응답 헤더 끝에 **HttpOnly**라는 꼬리표 옵션을 딱 달아서 보내줍니다.
    • Set-Cookie: session_id=1234567; HttpOnly;
  • 이 꼬리표가 붙은 쿠키를 받은 브라우저(크롬, 사파리)는 맹세합니다. "앞으로 이 쿠키는, 오직 정상적인 HTTP 통신(서버에 화면 달라고 요청할 때)을 할 때만 브라우저가 알아서 꺼내서 쓴다. 그 외에 웹페이지 안에서 돌아가는 자바스크립트 따위가 document.cookie 명령어로 감히 이 쿠키를 보여달라고 요구하면 무조건 거절(Access Denied)하겠다!"

2. 해커의 절망

  • 해커의 XSS 코드가 무사히 실행되어 document.cookie를 외쳐도, 브라우저는 텅 빈 문자열만 뱉어줍니다. 핵심 세션 쿠키는 HttpOnly 방탄유리 안에 들어있어 자바스크립트의 손길이 절대 닿지 않기 때문입니다.
  • 결과적으로 XSS 취약점이 뚫리더라도, 가장 치명적인 타격인 '세션 하이재킹(계정 탈취)'만큼은 완벽하게 방어해 내는 최고의 가성비 보호막이 됩니다.

Ⅳ. 추가 보호 옵션: Secure 속성

  • 쿠키를 탈취당하는 또 다른 구멍은, 와이파이를 몰래 도청(스니핑)하는 것입니다.
  • 이를 막기 위해 쿠키를 구워줄 때 **Secure**라는 옵션도 같이 달아줍니다. 이 꼬리표가 붙으면, 브라우저는 평문 통신인 http://에서는 쿠키를 절대 내보내지 않고, 완벽히 암호화된 https:// 통신을 할 때만 쿠키를 안전하게 실어 보냅니다.

📢 섹션 요약 비유: 세션 쿠키는 놀이공원 'VIP 목걸이 통행증'입니다. 해커가 보낸 자바스크립트 코드(document.cookie)는 깡패들이 내 주머니를 뒤져 통행증을 뺏어가는 짓(XSS)입니다. HttpOnly 속성은, 아예 통행증을 주머니에 넣지 못하게 내 '피부 속에 인식 칩으로 삽입'해 버리는 마법입니다. 놀이기구 입구(HTTP 통신)를 지나갈 땐 게이트가 알아서 내 피부 속 칩을 인식해 문을 열어주지만, 깡패(자바스크립트)들이 내 주머니를 아무리 뒤져봐야 만질 수 있는 통행증 실물이 아예 없으니 헛수고만 하고 털어가지 못하는 완벽한 보안책입니다.