본문 바로가기

Dev./Django.

[Django] Django Middleware

728x90
반응형

Middleware

https://docs.djangoproject.com/en/4.1/topics/http/middleware/ 

Django의 Request/ Response 처리에 연결되는 프레임 워크로 입출력을 특정한 app단이 아니라 전역적으로 변경하기 위한 가볍고 낮은 수준의 플러그인 시스템이다. 

Http Request가 들어오면 미들웨어를 거쳐 url에 매핑된 view로 보내고 Response역시 미들웨어를 거친다.

 

 

Django settings.py

미들웨어간의 유기적인 관계가 설정되어 있기 때문에 등록하는 순서가 중요하다.

HTTP Request는 위에서부터 순차적으로 미들웨어가 적용되며 Response를 반환할 때는 아래에서 위로 미들웨어가 적용된다.

MIDDLEWARE = [
	"django.middleware.security.SecurityMiddleware",
	"django.contrib.sessions.middleware.SessionMiddleware",
	"django.middleware.common.CommonMiddleware",
	"django.middleware.csrf.CsrfViewMiddleware",
	"django.contrib.auth.middleware.AuthenticationMiddleware",
	"django.contrib.messages.middleware.MessageMiddleware",
	"django.middleware.clickjacking.XFrameOptionsMiddleware",
]

SecurityMiddleware

SecurityMiddleware는 Request/Response 싸이클에 대한 몇 가지 보안 향상 기능을 제공한다. 각각의 기능들은 독립적으로 활성/비활성화 설정이 가능하다.

SessionMiddleware

세션을 지원해준다.

CommonMiddleware

몇가지 편의사항을 제공한다

  1. DISALLOWED_USER_AGENT: 사용자 에이전트에 대한 액세스를 금지시킨다.
  2. APPEND_SLASH: Request가 들어오는 url 이 urls.py 에 정의되어 있지 않을 경우 주소 뒤에 슬래쉬를 붙여서 리다이렉트된다.
  3. PREPEND_WWW: www가 없는 url은 www이 붙어서 리다이렉트된다.

CsrfViewMiddleware

POST 요청의 유효성을 검증하기 이전 쿠키로 전송된 csrftoken을 동일한 토큰값을 유지하고 사용하기 위해 request.META['CSRF_COOKIE']에 저장한다.

AuthenticationMiddleware

사용자 인증에 대한 처리를 한다. request.session으로 사용자를 확인하고 확인이 된 사용자는 request.user 객체에 넘겨준다.

세션 저장소를 사용하기 때문에  SessionMiddleware 뒤에 들어가야한다.

MessageMiddleware

쿠키 및 세션 기반 메시지 지원을 활성화한다. 세션기반 미들웨어 이기 때문에 SessionMiddleware 뒤에 들어가야한다.

XFrameOptionsMiddleware

X-Frame-Options header를 통해 간단한 클릭재킹을 보호한다

 

Custom Middleware

모든 Request/Response에 대해 특정 코드를 구현해야하는 경우에  커스텀 미들웨어를 사용할 수 있다. 함수형으로도 사용이 가능하지만클래스 미들웨어가 더 기능이 많고 구조화되어 있기 때문에 클래스형 미들웨어로 사용하였다.

class CustomMiddleware:
    def __init__(self, get_response): 
        self.get_response = get_response
       
    def __call__(self, request):
		# 뷰 호출전 각 리퀘스트에 대해 실행될 코드
        response = self.get_response(request)
		# 뷰 호출 후 각 리퀘스트/리스폰스에 대해 실행될 코드
        return response
  • __init__ (초기 생성자)
    • get_response 인자를 반드시 갖고 있어야 하고 유일한 인자로 받아야 middleware로서 작동한다
  • get_response
    • 장고의 미들웨어를 호출할 때 넘겨주는 함수로써 넘겨받는 대상은 다른 middleware 일수도 view일수도 있다
  • __call__
    • 요청당 한번 호출되는 메서드
    • 정의된 훅을 호출하고 반환해준다

Middleware Hook

클래스 기반 커스텀 미들웨어 작성시 Request/Response 전처리 메소드를 추가 정의할 수 있는데 이를 미들웨어 훅이라고 한다.

 Middleware Hook

  1. process_view(request, view_func, view_args, view_kwargs)

           view 호출 직전에 트리거된다. 

    • request-  HttpRequest 객체이다.
    • view_func - Django가 사용하려는 python 함수로 문자열 함수명이 아닌 실제 함수 객체이다.
    • view_args - view로 전달할 인수 (list)
    • view_kwargs - view로 전달할 키워드 인수 (dict)
    • None 또는 HttpResponse 객체를 반환해야 한다. None이 반환되면 Django는 해당 요청을 계속해서 처리하고 다른 미들웨어를 살행하고 적절한 뷰를 호출한다.  HttpResponse 객체를 반환하면 바로 결과를 반환한다.
  1. process_exception(request, exception)
    1. request-  HttpRequest 객체이다.
    2. exception - view에서 넘어오는 Exception object
    3. view에서 exception이 있을 때만 호출
    4. None 또는 HttpResponse 객체를 반환해야 한다.
  2. process_template_response(request, response)

          view가 실행을 다 끝내자 마자 호출된다. 단 response instance에 render()메서드나 비슷한 메서드가 있어야만 호출된다.

    • request-  HttpRequest 객체이다.
    • response - view 혹은 middleware에 의해 넘어오는 TemplateResponse object
    • 반드시 render method에 의한 response object 반환해야한다
    1.  
728x90
반응형