Skip to content

django middleware #

Find similar titles

7회 업데이트 됨.

Edit
  • 최초 작성자
    jwseo
  • 최근 업데이트
    jmchoi

Structured data

Category
Programming

Django Middleware란? #

개념 #

Django 공식문서에 따르면, Middleware를 'Django의 입력 또는 출력을 전역적으로 변경하기 위한 가볍고 낮은 수준의 플러그인 시스템'이라고 정의하고 있다. 간단히 말하면, Django Middleware는 요청과 응답 처리를 중간에서 가로채어 특정 기능을 추가하거나, 요청과 응답 자체를 조작하는 기능을 제공한다.

필요성 #

  1. 보안 및 인증과 관련하여 중복 코드를 피할 수 있다. 사용자 인증, CSRF 방어, 보안 헤더 추가 등의 보안 기능을 Middleware로 처리하면 개발자는 각 뷰마다 반복하지 않고 한 곳에서 중앙 집중적으로 관리할 수 있다. 따라서 개발자가 중복 코드 작성을 최소화하고 코드를 깔끔하게 유지할 수 있다.
  2. 전역적인 기능을 구현할 수 있다. 예를 들어, 로깅, 세션 관리, 다국어 지원, 캐싱 등과 같이 애플리케이션 전체에 영향을 주는 기능을 Middleware로 구현하여 코드의 모듈화와 재사용성을 높일 수 있다.
  3. 요청과 응답의 전처리 및 후처리를 할 수 있어 데이터 조작이나 응답 수정 등을 수행할 수 있다. 이를 통해 뷰 함수에서 처리하는 것보다 더 많은 기능을 추가하고 관리할 수 있다.

주의점 #

Image

Middleware는 settings.py에 나열된 순서대로 request를 거치고, 역순대로 response를 거친다. http 요청이 들어오면 Middleware를 거쳐서 해당 URL 에 등록된 뷰로 연결해주고, http 응답 역시 Middleware를 거쳐서 내보내기 때문이다.

따라서 Middleware의 순서 배열이 아주 중요하다. 또한 특정 Middleware에서 예외가 발생하면, 이후의 Middleware는 실행되지 않을 수 있으므로 주의가 필요하다.

Django middleware의 활용 #

Default Middleware #

Django에는 기본적으로 제공되는 여러 가지 Middleware가 있다. 이러한 Middleware들은 settings.py 파일에서 기본적으로 설정되어 있다. 따라서 개발자가 별도로 불러오거나 사용하지 않아도 자동으로 적용된다. 기본적으로 Django가 제공하는 몇 가지 중요한 Middleware의 목록과 역할은 다음과 같다.

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',
]
  • django.middleware.security.SecurityMiddleware: 보안 관련 기능을 제공하는 Middleware로, 보안 취약점을 방지하는 데 도움을 준다. 예를 들어, 클릭 재킹 방지(CSRF), Content Security Policy(CSP), XSS 보호 등을 자동으로 처리한다.

  • django.contrib.sessions.middleware.SessionMiddleware: 세션 관리를 위한 Middleware로, 사용자 세션을 처리한다. 사용자가 로그인한 상태를 유지하고 세션 데이터를 관리하는 데 사용된다.

  • django.middleware.common.CommonMiddleware: 다양한 기능들을 수행하는 Middleware로, 사용자의 IP 주소 추출, URL 정규화, Append Slash 등의 작업을 자동으로 처리한다.

  • django.middleware.csrf.CsrfViewMiddleware: CSRF(Cross-Site Request Forgery) 공격을 방지하기 위한 Middleware로, 뷰에서 POST 요청 시 CSRF 토큰을 검증한다.

  • django.contrib.auth.middleware.AuthenticationMiddleware: 사용자 인증과 관련된 Middleware로, 사용자 인증과 로그인 기능을 처리한다.

  • django.contrib.messages.middleware.MessageMiddleware: 사용자에게 메시지를 보여주는 데 사용되는 Middleware로, 주로 사용자에게 피드백을 제공하는 데 활용된다.

  • django.middleware.clickjacking.XFrameOptionsMiddleware: 모든 HTTP 응답에 X-Frame-Options 헤더를 추가하여 클릭 재킹 공격을 예방하는 Middleware로, 이에 따라 해당 웹사이트가 iframe에 포함되어 표시되는 것을 방지하여 보안성을 높이는 데 도움이 된다.

Custom Middleware #

기본으로 제공하는 Middleware에 더해서, 모든 요청이나 응답에 내가 의도한 기능을 부여하고 싶을 때 사용한다. Custom Middleware에는 클래스형과 함수형이 있다. 다음과 같은 순서에 따라 Custom Middleware를 적용할 수 있다.

  1. 함수형 Middleware 또는 클래스형 Middleware 정의: Middleware를 생성하기 위해 함수형 또는 클래스형 Middleware를 작성한다.
  2. 설정 파일에 등록: 작성한 Middleware를 Django 설정 파일(settings.py)의 MIDDLEWARE 섹션에 등록한다. 이때, 순서에 주의하여 적절한 위치에 배치해야 한다.

요청을 남길 때 Log라는 모델의 greet 컬럼에 'Hi'라는 텍스트를 저장하고, 응답을 내보낼 때 Log라는 모델의 greet 컬럼에 'Bye'라는 텍스트를 저장하고 싶다면, 하단과 같은 함수 또는 클래스를 작성할 수 있다.

  • 함수형 Custom Middleware

    from .models import Log
    
    def simple_middleware(get_response):
        def middleware(request):
            Log.objects.create(greet='Hi')
            response = get_response(request)
            Log.objects.create(greet='Bye')
            return response
        return middleware
    
  • 클래스형 Custom Middleware

    from .models import Log
    
    class SimpleMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            Log.objects.create(greet='Hi')
            response = self.get_response(request)
            Log.objects.create(greet='Bye')
    
            return response
    

이 외의 Middleware에 대한 사항은 Django 공식문서 참조를 권장

Reference #

0.0.1_20230725_7_v68