HttpOnly 플래그가 없는 민감한 쿠키

Sensitive Cookie Without 'HttpOnly' Flag

설명

'HttpOnly' 플래그가 없는 민감한 쿠키는 JavaScript에서 읽을 수 있습니다. XSS가 발생하면 공격 스크립트가 쿠키 값을 가져갈 수 있습니다. HttpOnly 자체가 XSS를 막는 것은 아닙니다.

잠재적 영향

  • 쿠키 탈취: 공격자가 XSS 공격을 통해 쿠키를 탈취할 수 있습니다.
  • 세션 하이재킹: 탈취된 쿠키를 통해 공격자가 세션을 가로챌 수 있습니다.
  • 데이터 유출: 민감한 데이터가 노출될 수 있습니다.

해결 방법

  • 'HttpOnly' 플래그 설정: 쿠키 생성 시 'HttpOnly' 플래그를 설정하여 JavaScript에서 접근할 수 없도록 합니다.
  • XSS 방지: XSS 공격을 방지하기 위해 입력값 검증 및 인코딩을 철저히 합니다.
  • 보안 설정 강화: 쿠키 보안 설정을 강화하여 쿠키의 무단 접근을 방지합니다.

Django의 CSRF 쿠키는 세션 쿠키와 용도가 다릅니다. CSRF_COOKIE_HTTPONLY=False 자체는 취약점이 아니며, JavaScript에서 CSRF 토큰을 읽는 방식에 맞게 설정합니다.

예시

변경 전

python
# Unsafe Django cookie settings
SESSION_COOKIE_HTTPONLY = False

변경 후

python
# Safe Django cookie settings
SESSION_COOKIE_HTTPONLY = True

변경 전

python
# Unsafe Flask cookie settings
from flask import Flask

app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_HTTPONLY=False,
)

변경 후

python
# Safe Flask cookie settings
from flask import Flask

app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_HTTPONLY=True,
)

변경 전

python
# Unsafe FastAPI cookie settings
from fastapi import FastAPI, Response
import secrets

app = FastAPI()

@app.post("/set-cookie")
async def set_cookie(response: Response):
    session_id = secrets.token_urlsafe(32)  # 서버가 발급한 예측 불가능한 세션 값
    response.set_cookie(
        key="session",
        value=session_id,
        httponly=False,
        secure=True,
        samesite="lax",
    )
    return {"message": "Cookie set"}

변경 후

python
# Safe FastAPI cookie settings
from fastapi import FastAPI, Response
import secrets

app = FastAPI()

@app.post("/set-cookie")
async def set_cookie(response: Response):
    session_id = secrets.token_urlsafe(32)  # 서버가 발급한 예측 불가능한 세션 값
    response.set_cookie(
        key="session",
        value=session_id,
        httponly=True,
        secure=True,
        samesite="lax",
    )
    return {"message": "Cookie set"}

설명

  • 변경 전: 'HttpOnly' 플래그가 설정되지 않아 JavaScript에서 쿠키에 접근할 수 있습니다.
  • 변경 후: 'HttpOnly' 플래그를 설정하여 JavaScript에서 쿠키에 접근하지 못하도록 합니다.

참조