๐[Django] settings.py ํํค์น๊ธฐ 3 - MIDDLEWARE (SecurityMiddleware)
SecurityMiddleware๋?
from typing import Any
from django.http.request import HttpRequest
from django.http.response import HttpResponse, HttpResponsePermanentRedirect
from django.utils.deprecation import MiddlewareMixin
class SecurityMiddleware(MiddlewareMixin):
sts_seconds: int = ...
sts_include_subdomains: bool = ...
sts_preload: bool = ...
content_type_nosniff: bool = ...
xss_filter: bool = ...
redirect: bool = ...
redirect_host: str | None = ...
redirect_exempt: list[Any] = ...
def process_request(
self, request: HttpRequest
) -> HttpResponsePermanentRedirect | None: ...
def process_response(
self, request: HttpRequest, response: HttpResponse
) -> HttpResponse: ...
SecurityMiddleware
์ ๋ํด ChatGPT์๊ฒ ๋ฌผ์ด๋ดค๋ค.
SecurityMiddleware
๋ django-admin startproject
๋ช
๋ น์ด๋ฅผ ํตํด ์์ฑํ ํ๋ก์ ํธ๋ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋๋ ๋ฏธ๋ค์จ์ด ์ค ํ๋๋ก, Django ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณด์์ ๊ฐํํ๋ ์ฌ๋ฌ ๊ฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
[ChatGPT] SecurityMiddleware์ ์ฃผ์ ์ญํ
HTTPS ๋ฆฌ๋๋ ์
SECURE_SSL_REDIRECT
์ค์ ์ด True
์ธ ๊ฒฝ์ฐ, ๋ชจ๋ HTTP ์์ฒญ์ HTTPS๋ก ๋ฆฌ๋๋ ์
ํ๋ค.
์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ ํ HTTPS ํ๋กํ ์ฝ์ ํตํด์๋ง ์๋ฒ์ ์ ์ํ๋๋ก ๊ฐ์ ํ๋ ์ญํ ์!
์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ ์ ์ก ์ค ๋ฐ์ํ ์ ์๋ ๋์ฒญ ๊ณต๊ฒฉ์ ์๋ฐฉํ ์ ์๋ค!
HTTP Strict Transport Security (HSTS)
SECURE_HSTS_SECONDS
์ค์ ์ ํตํด HSTS ํค๋๋ฅผ ์ค์ ํ ์ ์๋ค.
์ด ํค๋๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ํน์ ๊ธฐ๊ฐ๋์ ํด๋น ๋๋ฉ์ธ์ ๋ํด ์ค์ง HTTPS ์ฐ๊ฒฐ๋ง ํ์ฉํ๋๋ก ์ง์ํ๋ ์ญํ ์ด๋ค!
HSTS๋ HTTPS๋ก ์ฌ์ดํธ์ ์ฒ์ ์ ์ํ ์ดํ ๋ค์ HTTPS๋ก ์ ์ํ์ง ๋ชปํ๊ฒ ํ์ฌ, ์ค๊ฐ์ ๊ณต๊ฒฉ(MITM)
์ ์๋ฐฉํจ!
๋ง์ฝ SECURE_HSTS_INCLUDE_SUBDOMAINS
๋ฅผ True
๋ก ์ค์ ํ๋ฉด,. ์๋ธ ๋๋ฉ์ธ์์๋ HSTS ์ ์ฑ
์ด ์ ์ฉ๋๋ค..!
๋, SECURE_HSTS_PRELOAD
์ค์ ์ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ์ HSTS ํ๋ฆฌ๋ก๋ ๋ฆฌ์คํธ์ ๋๋ฉ์ธ์ ์ถ๊ฐํ ์ ์๋ค๊ณ ํ๋ค.
X-Content-Type-Options ํค๋ ์ค์
์๋ต ํค๋์ X-Content-Type-Options: nosniff
ํค๋๋ฅผ ์ถ๊ฐํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ธ๋ ์ฝํ
์ธ ์ ํ(MIME ํ์
)์ ๋ฌด์ํ๊ณ ํ์ผ์ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ์ง ์๋๋ก ํ๋ค.
์ด ํค๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ชป๋ MIME ํ์
์ ๊ฐ์ ๋ก ํด์ํ์ง ์๋๋ก ํ์ฌ MIME ์ค๋ํ ๊ณต๊ฒฉ
์ ๋ฐฉ์งํ๋ค!
X-XSS-Protection ํค๋ ์ค์
X-XSS-Protection: 1; mode-block
ํค๋๋ฅผ ์ถ๊ฐํ์ฌ, ๋ธ๋ผ์ฐ์ ์ XSS(๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ
)
ํํฐ๋ฅผ ํ์ฑํํ๊ณ ๊ณต๊ฒฉ์ด ํ์ง๋ ๊ฒฝ์ฐ ํ์ด์ง ๋ก๋๋ฅผ ์ค์ง์ํจ๋ค!
์ด ํค๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์๋ต์ ํฌํจ๋๋ค๊ณ ํจ.
X-Frame-Options ํค๋ ์ค์
ํด๋ฆญ์ฌํน(Clickjacking)
๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ต ํค๋์ X-Frame-Options
๋ฅผ ์ค์ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก DENY
๋ก ์ค์ ๋์ด ์๋๋ฐ, ํด๋น ํ์ด์ง๊ฐ iframe์ผ๋ก ํฌํจ๋์ง ๋ชปํ๋๋ก ํจ!
์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ์น์ฌ์ดํธ์์ ํด๋น ํ์ด์ง๋ฅผ ๋ถ๋ฒ์ ์ผ๋ก ํ๋ ์์ ํฌํจ์ํค๋ ๊ณต๊ฒฉ์ ์๋ฐฉํ ์ ์๋ค๊ณ ํ๋ค..!
[๊ณต์ ๋ฌธ์] django.middleware.security.SecurityMiddleware
Django๋ request/reseponse
์ฃผ๊ธฐ์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ง ๋ณด์ ๊ฐํ๋ฅผ ์ํด SecurityMiddleware
๋ฅผ ์ ๊ณตํ๋ค.
๋ค์์ ์ค์ ๋ค์ ๊ฐ๊ฐ ์กฐ์ํ์ฌ ํ์ฑํ ๋ฐ ๋นํ์ฑํ ํ ์ ์๋ค.
- SECURE_CONTENT_TYPE_NOSNIFF
- ๊ธฐ๋ณธ ๊ฐ: True
- True ์ด๋ฉด, ์ด๋ฏธ ํด๋น ํค๋๊ฐ ์๋ ๋ชจ๋ ์๋ต์ [
X-Content-Type-Options:nosniff](https://www.notion.so/Python-Celery-task-bind-True-False-8c9ffa58286f4161abf58c895bc677b9?pvs=21)SecurityMiddleware
ํค๋๋ฅผ ์ค์ ํ๋ค.
- SECURE_CROSS_ORIGIN_OPENER_POLICY
- ๊ธฐ๋ณธ ๊ฐ: โsame-originโ
- None์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด
SecurityMiddleware
๋Cross-Origin Opener Policy
**ํค๋๊ฐ ์๋ ๋ชจ๋ ์๋ต์ ๋ํด ์ ๊ณต๋ ๊ฐ์ผ๋ก ์ค์ ๋๋ค.
- SECURE_HSTS_INCLUDE_SUBDOMAINS
- ๊ธฐ๋ณธ ๊ฐ: False
- True์ธ ๊ฒฝ์ฐ,
SecurityMiddleware
๋includeSubDomains
์ง์๋ฌธ์HTTP Strict Transport Security
ย ํค๋์ ์ถ๊ฐ๋๋ค. ๋,SECURE_HSTS_SECONDS
๋ฅผ 0์ด ์๋ ๊ฐ์ผ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ์ด ์ง์์ด๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค. - ์ด ๊ฐ์ ์๋ชป ์ค์ ํ๊ฒ ๋๋ฉด ์ฌ์ดํธ๊ฐ ๋์ดํฌ ์ ์๊ฒ ์์๋ ์ ์์ผ๋ ์ฃผ์ํด์ผ ํ๋ค.
- SECURE_HSTS_PRELOAD
- ๊ธฐ๋ณธ ๊ฐ: False
- True์ธ ๊ฒฝ์ฐ,
SecurityMiddleware
๊ฐHTTP Strict Transport Security
ํค๋์preload
์ง์์ด๋ฅผ ์ถ๊ฐํ๋ค. ๋,SECURE_HSTS_SECONDS
๋ฅผ 0์ด ์๋ ๊ฐ์ผ๋ก ์ค์ ํ์ง ์๊ฒ๋๋ฉด ์ด ์ง์์ด๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- SECURE_HSTS_SECONDS
- ๊ธฐ๋ณธ ๊ฐ: 0
- 0์ด ์๋ ์ ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ฉด,
SecurityMiddleware
๊ฐ ์์ง ์๋ ๋ชจ๋ ์๋ต์HTTP Strict Transport Security
ํค๋๋ฅผ ์ค์ ํ๋ค. - ์๋ชป๋ ๊ฐ์ผ๋ก ์ค์ ํ ๊ฒฝ์ฐ, ์ฌ์ดํธ๊ฐ ๋์ดํฌ ์ ์์ด ์์๋ ์ ์์ผ๋ ์ฃผ์ํ์.
- SECURE_REDIRECT_EXEMPT
- ๊ธฐ๋ณธ ๊ฐ: [] (๋น ๋ฆฌ์คํธ)
- URL ๊ฒฝ๋ก๊ฐ ์ด ๋ฆฌ์คํธ์ ์ ๊ท์๊ณผ ์ผ์นํ๋ฉด, ์์ฒญ์ด HTTPS๋ก ๋ฆฌ๋๋ ์
๋์ง ์๋๋ค.
SecurityMiddleware
๋ URL ๊ฒฝ๋ก์์/
๋ฅผ ์ ๊ฑฐํ๋ฏ๋ก, ํจํด์/
๋ฅผ ํฌํจ์ํค์ง ์๋๋ก ํด์ผํ๋ค.
- SECURE_REFERRER_POLICY
- ๊ธฐ๋ณธ ๊ฐ: โsame-originโ
- ์ด ์ค์ ๋ ๊ฒฝ์ฐ
SecurityMiddleware
๋Referrer Policy
ํค๋๊ฐ ์๋ ๋ชจ๋ ์๋ต์ ์ฐธ์กฐ์ ์ ์ฑ ํค๋๋ฅผ ์ ๊ณต ๋ฐ์ ๊ฐ์ผ๋ก ์ค์ ๋๋ค.
- SECURE_SSL_HOST
- ๊ธฐ๋ณธ ๊ฐ: None
- ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋ชจ๋ SSL ๋ฆฌ๋๋ ์
์ ์๋ ์์ฒญ๋ ํธ์คํธ๊ฐ ์๋ ์ด ํธ์คํธ๋ก ์ฐ๊ฒฐ๋๋ค.
SECURE_SSL_REDIRECT
๊ฐ False์ธ ๊ฒฝ์ฐ, ์ด ์ค์ ์ ์๋ฌด๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- SECURE_SSL_REDIRECT
- ๊ธฐ๋ณธ ๊ฐ: False
- True์ธ ๊ฒฝ์ฐ,
SecurityMiddleware
๋ ๋ชจ๋ non-HTTPSredirects
์ HTTPS๋ก ๋ฆฌ๋๋ ์ ํ๋ค. (SECURE_REDIRECT_EXEMPT
์ ๋ช ์๋ ์ ๊ท์๊ณผ ์ผ์นํ๋ URL์ ์ ์ธ์.)
์ฐธ๊ณ ์๋ฃ
[Middleware | Django documentation](https://docs.djangoproject.com/en/5.1/ref/middleware/) |
๋๊ธ๋จ๊ธฐ๊ธฐ