๐[Django] settings.py ํํค์น๊ธฐ 4 - MIDDLEWARE (SessionMiddleware)
SessionMiddleware๋?
from django.contrib.sessions.backends.base import SessionBase
from django.http.request import HttpRequest
from django.http.response import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class SessionMiddleware(MiddlewareMixin):
SessionStore: type[SessionBase] = ...
def process_request(self, request: HttpRequest) -> None: ...
def process_response(
self, request: HttpRequest, response: HttpResponse
) -> HttpResponse: ...
SessionMiddleware
๋ Django์์ ์ฌ์ฉ์๋ณ๋ก ์ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๋ฐ ํ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
์ด๋ฅผ ํตํด ๋ก๊ทธ์ธ ์ํ ์ ์ง, ์ฅ๋ฐ๊ตฌ๋ ๋ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
์ธ์ ๋ฐ์ดํฐ๋ ์๋ฒ ์ธก์ ์ ์ฅ๋์ด ๊ด๋ฆฌ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์ฟ ํค๋ฅผ ํตํด ์ธ์ ์ ์๋ณํ ์ ์๋ค.
[ChatGPT] SessionMiddleware์ ์ฃผ์ ์ญํ
์ธ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ
SessionMiddleware
๋ ๊ฐ HTTP ์์ฒญ์ ๋ํด ์ธ์
๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ , ์ด๋ฅผ request.session
์ด๋ผ๋ ์์์ ์ ์ฅํจ!
์ด ์์๋ฅผ ํตํด ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค!
views function์์ request ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉํ๋ฉด ๋ ๋ฏ!
์ธ์ ์ ์์ฑ ๋ฐ ์ ์ง
Django์ ์ธ์
์ ์ฟ ํค
๊ธฐ๋ฐ์ผ๋ก ๊ด๋ฆฌ๋จ.
SessionMiddleware
๋ ํด๋ผ์ด์ธํธ์๊ฒ sessionid
๋ผ๋ ์ด๋ฆ์ ์ฟ ํค๋ฅผ ์ค์ ํ๋ค.
์ด ์ฟ ํค๋ ์๋ฒ์ ์ ์ฅ๋ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ๊ณ ์ ํ ํค์!
๋, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค, Django๋ sessionid
์ฟ ํค๋ฅผ ์ฌ์ฉํด ์๋ฒ ์ธก์์ ํด๋น ์ฌ์ฉ์์ ์ธ์
๋ฐ์ดํฐ๋ฅผ ๋ก๋ํจ.
์ธ์ ๋ฐ์ดํฐ์ ์ง์์ฑ
์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ๋ฅผ ๋ ๋ฌ๋ค๊ฐ ๋ค์ ๋์์๋, ์ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋ ์ ์๋๋ก ์ฟ ํค์ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํ ์ ์๋ค.
์ธ์
๋ง๋ฃ ์๊ฐ์ Django ์ค์ ํ์ผ์ SESSION_COOKIE_AGE
๋ก ์กฐ์ ํ ์ ์๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก 2์ฃผ(1209600์ด)๋ก ์ค์ ๋์ด ์๋ค!!
์ธ์ ์ด ์ ํจํ์ง ์๊ฑฐ๋, ๋ง๋ฃ๋๋ฉด ์๋ก์ด ์ธ์ ์ด ์์ฑ๋จ.
$ python manage.py shell
>>> from django.conf import settings
>>> settings.SESSION_COOKIE_AGE
1209600
๋ฐ์ดํฐ์ ์์์ฑ ๋ฐ ์ ์ฅ์
Django๋ ๋ค์ํ ์ธ์ ๋ฐฑ์๋๋ฅผ ์ง์ํ๋ค.
์ธ์ ๋ฐ์ดํฐ๋ DB, ์บ์, ํ์ผ ์์คํ , ์ํธํ๋ ์ฟ ํค ๋ฑ์ ์ ์ฅํ ์ ์๋ค!
์ธ์
๋ฐฑ์๋๋ SESSION_ENGINE
์ค์ ์ ํตํด ๋ณ๊ฒฝํ ์ ์์.
์๋ฅผ ๋ค์ด ,django.contrib.sessions.backends.db
๋ DB์ ์ธ์
์ ์ ์ฅํ๋ฉฐ ๊ธฐ๋ณธ ์ค์ ์.
๋, django.contrib.sessions.backends.cache
๋ ์บ์์ ์ ์ฅํ๋ฉฐ ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ
์ ์ฌ์ฉ๋ ์ ์๋ค.
์ธ์ ๋ฐ์ดํฐ์ ๋ณด์
์ธ์ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ๋ ธ์ถ๋์ง ์๋๋ค!
์ธ์ ID๋ง ํด๋ผ์ด์ธํธ์ ์ฟ ํค๋ก ์ ๋ฌ๋๊ณ , ์ด ID๋ฅผ ํตํด ์๋ฒ์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ฐฉ์์ด๋ค.
์ด ๋ฐฉ์์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์๊ฒ ํ์ฌ ๋ณด์์ ๊ฐํํ ์ ์๋ค!
SESSION_COOKIE_SECURE
, SESSION_COOKIE_HTTPONLY
๋ฑ์ ์ค์ ์ ํตํด ์ธ์
์ฟ ํค์ ๋ณด์์ ๊ฐํํ ์ ์๋ค.
[๊ณต์ ๋ฌธ์] django.contrib.sessions.middleware.SessionMiddleware
- SESSION_CACHE_ALIAS
- ๊ธฐ๋ณธ ๊ฐ: โdefaultโ
cache-based session storage
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉํ ์บ์๋ฅผ ์ ํํ๋ค.
- SESSION_COOKIE_AGE
- ๊ธฐ๋ณธ ๊ฐ: 1209600(์ด) - 2์ฃผ
- ์ธ์ ๋ฐ ์ฟ ํค์ ์๋ช ์ด๋ค.
- SESSION_COOKIE_DOMAIN
- ๊ธฐ๋ณธ ๊ฐ: None
- ์ธ์ ๋ฐ ์ฟ ํค์ ์ฌ์ฉํ ๋๋ฉ์ธ์ ๋ปํ๋ค. โexample.comโ๊ณผ ๊ฐ์ ๋ฌธ์์ด๋ก ์ค์ ํ๊ฑฐ๋ ํ์ค ๋๋ฉ์ธ ์ฟ ํค์ ๊ฒฝ์ฐ, None์ ์ฌ์ฉํ๋ค.
- ๋ง์ฝ
CSRF_USE_SESSIONS
์ ํจ๊ป ๊ต์ฐจ ๋๋ฉ์ธ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด **CSRF ๋ฏธ๋ค์จ์ด์ ์ฐธ์กฐ์ ํ์ธ์ ์ํด leading dot(์: example.com)์ ํฌํจํด์ผ ํ๋ค. - ์ด์ ์ ํ์ค ๋๋ฉ์ธ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ดํธ์์ ๊ต์ฐจ ๋๋ฉ์ธ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋๋ก ์ด ์ค์ ์ ์ ๋ฐ์ดํธ ํ๊ฒ๋๋ฉด, ๊ธฐ์กด ์ฌ์ฉ์ ์ฟ ํค๊ฐ ์ด์ ๋๋ฉ์ธ์ผ๋ก ์ค์ ๋์ด ์ฟ ํค๊ฐ ์ง์๋๋ ํ ๋ก๊ทธ์ธ์ ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ ์ฃผ์ํ์.
- ์ด ์ค์ ์ [
django.contrib.messages
](https://docs.djangoproject.com/en/5.1/ref/contrib/messages/#module-django.contrib.messages) ์ฟ ํค์๋ ์ํฅ์ ๋ฏธ์นจ!
- SESSION_COOKIE_HTTPONLY
- SESSION_COOKIE_NAME
- ๊ธฐ๋ณธ ๊ฐ: โsessionidโ
- ์ธ์ ์ ์ฌ์ฉํ ์ฟ ํค์ ์ด๋ฆ์!
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ์ฟ ํค ์ด๋ฆ๊ณผ ๋ค๋ฅด์ง ์๋ค๋ฉด, ์ํ๋ ์ด๋ฆ์ผ๋ก ์ง์ ํ ์ ์๋ค.
- SESSION_COOKIE_PATH
- ๊ธฐ๋ณธ ๊ฐ: โ/โ
- ์ธ์ ๋ฐ ์ฟ ํค์ ์ค์ ๋ ๊ฒฝ๋ก์!
- ์ด ๊ฒฝ๋ก๋ Django ์ค์น ๊ฒฝ๋ก์ ์ผ์นํ๊ฑฐ๋ ํด๋น ๊ฒฝ๋ก์ ์์ ๊ฒฝ๋ก์ฌ์ผ ํ๋ค. ๋์ผํ ํธ์คํธ ์ด๋ฆ์ผ๋ก ์คํ๋๋ ์ฌ๋ฌ Django ์ธ์คํด์ค๊ฐ ์๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ฉฐ, ๊ฐ ์ธ์คํด์ค๋ ์๋ก ๋ค๋ฅธ ์ฟ ํค ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค! ๋, ๊ฐ ์ธ์คํด์ค์๋ ์์ฒด ์ธ์ ์ฟ ํค๋ง ํ์๋๋ค.
- SESSION_COOKIE_SAMESITE
- ๊ธฐ๋ณธ ๊ฐ: โLaxโ
- ์ธ์
๋ฐ ์ฟ ํค์
SameSite
ํ๋๊ทธ ๊ฐ์ด๋ค. - ์ด ํ๋๊ทธ๋ ์ฌ์ดํธ ๊ฐ์ ์์ฒญ์์ ์ฟ ํค๊ฐ ์ ์ก๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ณ , ์ธ์ ์ฟ ํค๋ฅผ ํ์น๋ ์ผ๋ถ ๋ฐฉ๋ฒ์ ๋ถ๊ฐ๋ฅํ๊ฒ ํ๋ค.
- ์ค์ ๊ฐ๋ฅํ ๊ฐ
- โStrictโ (์๊ฒฉ)
- ์ผ๋ฐ ๋งํฌ๋ฅผ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ต์ฐจ ์ฌ์ดํธ ํ์ ์ปจํ ์คํธ์์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฟ ํค๋ฅผ ๋์ ์ฌ์ดํธ๋ก ๋ณด๋ด์ง ๋ชปํ๋๋ก ํ๋ค.
- โLaxโ (๋์จํจ)
- ์ธ๋ถ ๋งํฌ๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ๋์ฐฉํ ํ์๋ ๋ก๊ทธ์ธํ ์ธ์ ์ ์ ์งํ๋ ค๋ ์น ์ฌ์ดํธ์ ๋ณด์๊ณผ ์ฌ์ฉ์ฑ ๊ฐ์ ๊ท ํ์ ์ ๊ณตํ๋ค.
- โNoneโ
- ๋ชจ๋ ๋์ผ ์ฌ์ดํธ ๋ฐ ๊ต์ฐจ ์ฌ์ดํธ ์์ฒญ๊ณผ ํจ๊ป ์ธ์ ๋ฐ ์ฟ ํค๊ฐ ์ ์ก๋๋ค.
- False
- ํ๋๊ทธ๋ฅผ ๋นํ์ฑํํ๋ค.
- โStrictโ (์๊ฒฉ)
- SESSION_COOKIE_SECURE
- ๊ธฐ๋ณธ ๊ฐ: False
- ์ธ์ ๋ฐ ์ฟ ํค์ ๋ณด์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ง์ ๋ํ ์ฌ๋ถ ์ต์ ์ด๋ค!
- ์ด ์ต์ ์ True๋ก ์ค์ ํ ๊ฒฝ์ฐ, ์ฟ ํค๊ฐ โ๋ณด์โ์ผ๋ก ํ์๋์ด ๋ธ๋ผ์ฐ์ ๋ HTTPS ์ฐ๊ฒฐ์์๋ง ์ฟ ํค๋ฅผ ์ ์กํ ์ ์๋๋ก ํ๋ค.
- ์ด ์ค์ ์ ํด์ ํ ๊ฒฝ์ฐ, ๊ณต๊ฒฉ์๊ฐ
ํจํท ์ค๋ํผ
๋ก ์ํธํ๋์ง ์์ ์ธ์ ๋ฐ ์ฟ ํค๋ฅผ ์บก์ณํ์ฌ ํ์ทจํ ์ ์์ผ๋ฏ๋ก, ํด์ ํ๋ ๊ฒ์ ์ข์ ์ ํ์ ์๋!
- SESSION_ENGINE
- ๊ธฐ๋ณธ ๊ฐ: โdjango.contrib.sessions.backends.dbโ
- Django๊ฐ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์์น๋ฅผ ์ ์ดํ๋ค.
- ๋ค์ํ ์์ง๋ค
- โdjango.contrib.sessions.backends.dbโ
- โdjango.contrib.sessions.backends.fileโ
- โdjango.contrib.sessions.backends.cacheโ
- โdjango.contrib.sessions.backends.cached_dbโ
- โdjango.contrib.sessions.backends.signed_cookiesโ
- ์์ธํ ๋ด์ฉ์
Configuring the session engine
๋ฅผ ์ฐธ๊ณ ํ ์ ์๋ค!
- SESSION_EXPIRE_AT_BROWSER_CLOSE
- ๊ธฐ๋ณธ ๊ฐ: False
- ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ์ ๋ ์ธ์ ์ ๋ง๋ฃํ ์ง์ ๋ํ ์ฌ๋ถ ์ต์ ์!
Browser-length sessions vs. persistent sessions
๋ฅผ ์ฐธ๊ณ ํ ์ ์๋ค.
- SESSION_FILE_PATH
- ๊ธฐ๋ณธ ๊ฐ: None
- ํ์ผ ๊ธฐ๋ฐ ์ธ์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Django๊ฐ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํ๋ค.
- ๊ธฐ๋ณธ ๊ฐ(None)์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Django๋ ์์คํ ์ ํ์ค ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํจ!
- SESSION_SAVE_EVERY_REQUEST
- ๊ธฐ๋ณธ ๊ฐ: False
- ๋ชจ๋ ์์ฒญ์ ๋ํ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ์ ํ๋ ์ต์ ์!
- ๊ธฐ๋ณธ ๊ฐ(False)๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋์์ ๋(์ฆ, ํด๋น ์ฌ์ ๊ฐ์ด ํ ๋น๋๊ฑฐ๋ ์ญ์ ๋ ๊ฒฝ์ฐ), ์ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค.
- ์ด ์ค์ ์ด ํ์ฑํ ๋์ด์๋๋ผ๋ ๋น ์ธ์ ์ ์์ฑ๋์ง ์๋๋ค.
- SESSION_SERIALIZER
- ๊ธฐ๋ณธ ๊ฐ: โdjango.contrib.sessions.serializers.JSONSerializerโ
- ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋ ๋ฐ ์ฌ์ฉํ serializer ํด๋์ค์ ์ ์ฒด ๊ฐ์ ธ์ค๊ธฐ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค.
Session serialization
๋ฅผ ์ฐธ๊ณ ํ ์ ์๋ค!
๋ ๋ค๋ฅธ Django ์ธ์ ์ฌ์ฉ ๋ฐฉ๋ฒ?
Django์์๋ SessionMiddleware
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ด์ธ์ django-session-timeout
์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ธ์
๋ง๋ฃ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค!
๐ย django-session-timeout์ด ๋ญ์ง?
๋ณดํต ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ ๋ฑ์ ๊ฒฝ์ฐ๋ ๊ธฐ์กด์ ์กด์ฌํ๋ ์ด๋ค ๊ธฐ์ ์ ์ด๋ ํ ๋ถํธํ ์ (?)์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
django-session-timeout ์ ์ด๋ค ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ฑ์ฅํ๊ฑฐ์ง?
์ฌ์ค ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ๊ธฐ์กด์ SessionMiddleware
๋ก ์ถฉ๋ถํ๋ค.
ํ์ง๋ง, SessionMiddleware
๋ ์ฌ์ฉ์์ ๋นํ์ฑ์ํ
์ฆ, ์ผ์ ์๊ฐ ๋์ ํ๋์ด ์์ ๊ฒฝ์ฐ์ ๋ํ ๋ถ๋ถ์ด ๋ถ์กฑํ๋ค๊ณ ํ๋ค.
์ด๋ฌํ ๋ถ๋ถ์ django-session-timeout
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํด๊ฒฐํ ์ ์๋ค.
๋, django-session-timeout
์ ์ธ์
๋ง๋ฃ ์ ๋ฆฌ๋๋ ์
ํ ํ์ด์ง๋ฅผ ์ง์ ํ ์ ์๋ค๋ ์ ๋ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ณด์์ด ์ค์ํ ๊ฒฝ์ฐ ํน์ ํน๋ณํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ฌ์ฉ์์ ๋นํ์ฑ์ํ์ ๋ฐ๋ฅธ ์ธ์
๋ง๋ฃ ๊ธฐ๋ฅ์ ์๊ตฌํ๋ ๊ฒฝ์ฐ์๋ SessionMiddleware
์ django-session-timeout
์ ์ ์ ํ๊ฒ ํผ์ฉํด์ฃผ๋ฉด ๋ ๊ฒ ๊ฐ๋ค..!
์ฐธ๊ณ ์๋ฃ
[Settings | Django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#id15) |
๋๊ธ๋จ๊ธฐ๊ธฐ