설명
'HttpOnly' 플래그가 없는 민감한 쿠키는 JavaScript에서 읽을 수 있습니다. XSS가 발생하면 공격 스크립트가 쿠키 값을 가져갈 수 있습니다. HttpOnly 자체가 XSS를 막는 것은 아닙니다.
잠재적 영향
- 쿠키 탈취: 공격자가 XSS 공격을 통해 쿠키를 탈취할 수 있습니다.
- 세션 하이재킹: 탈취된 쿠키를 통해 공격자가 세션을 가로챌 수 있습니다.
- 데이터 유출: 민감한 데이터가 노출될 수 있습니다.
해결 방법
- 'HttpOnly' 플래그 설정: 쿠키 생성 시 'HttpOnly' 플래그를 설정하여 JavaScript에서 접근할 수 없도록 합니다.
- XSS 방지: XSS 공격을 방지하기 위해 입력값 검증 및 인코딩을 철저히 합니다.
- 보안 설정 강화: 쿠키 보안 설정을 강화하여 쿠키의 무단 접근을 방지합니다.
Django의 CSRF 쿠키는 세션 쿠키와 용도가 다릅니다. CSRF_COOKIE_HTTPONLY=False 자체는 취약점이 아니며, JavaScript에서 CSRF 토큰을 읽는 방식에 맞게 설정합니다.
예시
Django cookie settings
변경 전
python
# Unsafe Django cookie settings
SESSION_COOKIE_HTTPONLY = False
변경 후
python
# Safe Django cookie settings
SESSION_COOKIE_HTTPONLY = True
Flask cookie settings
변경 전
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,
)
FastAPI cookie settings
변경 전
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에서 쿠키에 접근하지 못하도록 합니다.