웹프로그래밍/Django
[Django] Clickjacking Protection, 클릭 재킹 방지
ssung.k
2020. 5. 6. 18:06
클릭 재킹이란?
클릭재킹
이란 UI 수정 공격이라고도 하며 사용자가 본인이 인식하는 것과 다른 항목을 클릭 하도록 속여서 기밀 정보를 공개하거나 다른 사람이 자신의 컴퓨터를 제어하도록 하는 악의적인 기술입니다.
예를 들어 생각을 해봅시다. 구매 버튼을 눌러 물건을 구입할 수 있는 온라인 사이트가 있습니다. 여기서 구매와 관련 없는 버튼들 위에 보이지않게 투명 iframe을 만들어 물건을 구매하게 하는 방법인것이죠.
클릭 재킹 방지
이를 방지하기 위해서 브라우저에서 이에 대한 보안을 관리하고 있습니다. 자원이 frame 또는 iframe 내에서 로드 될 수 있는지 여부를 판단하기 위해 HTTP header의 X-Frame-Options
를 사용합니다.
이 값이 SAMEORIGIN
이고 같은 사이트에서 요청이 온거라면 로드하고 DENY
라면 거부하게 됩니다.
Django에서의 설정
django에서는 우리도 모르는 사이에 이 값을 설정해주고 있습니다.
middleware
settings
에 보면 XFrameOptionsMiddleware
라는 미들웨어가 존재하는데 여기서 모든 response에 대해서 DENY
값을 넣어주게 됩니다.
# config/settings.py
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
기존에는 default가
SAMEORIGIN
이었지만 django 3 버젼부터DENY
로 바뀌었습니다.
DENY
가 아닌 다른 값을 원하면 header에 다음과 같이 설정해줄 수 있습니다.
X_FRAME_OPTIONS = 'SAMEORIGIN'
decorator
decorator
를 통해서 이를 설정할 수도 있습니다.
이는 미들웨어보다 우선순위가 높습니다.
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny, xframe_options_sameorigin
@xframe_options_deny
def view_one(request):
return HttpResponse("I won't display in any frame!")
@xframe_options_sameorigin
def view_two(request):
return HttpResponse("Display in a frame if it's from the same origin as me.")