Python Django

Django 미들웨어 개념과 활용법

PyExplorer 2025. 3. 8. 09:25
728x90

Django 미들웨어 개념과 활용법

Django는 강력한 웹 프레임워크로서 다양한 기능을 제공하는데, 그중에서도 미들웨어(Middleware)는 요청과 응답을 가로채어 추가적인 처리를 수행할 수 있는 중요한 구성 요소입니다. 이번 글에서는 Django의 미들웨어 개념과 활용법에 대해 알아보고, 직접 미들웨어를 구현하는 방법을 예제 코드와 함께 설명하겠습니다.


1. 미들웨어란?

미들웨어(Middleware)는 Django의 요청(Request)과 응답(Response) 사이에서 특정 작업을 수행하는 컴포넌트입니다. 미들웨어를 활용하면 요청을 가로채어 사전 처리하거나, 응답을 가로채어 변형하는 등의 작업이 가능합니다.

Django에서 미들웨어는 다음과 같은 역할을 수행할 수 있습니다:

  • 요청(request) 전처리
  • 응답(response) 후처리
  • 요청을 가로채어 차단하거나 리디렉션
  • 사용자 인증 및 권한 부여
  • 보안 관련 기능 (예: CSRF 보호, CORS 설정)
  • 로깅 및 성능 모니터링

Django에서는 기본적으로 여러 개의 미들웨어가 제공되며, MIDDLEWARE 설정에서 이를 관리할 수 있습니다.

2. Django 기본 미들웨어

Django는 여러 가지 기본 미들웨어를 제공하며, settings.py 파일에서 이를 확인하고 설정할 수 있습니다.

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: 보안 관련 기능을 제공 (예: HTTPS 리디렉션)
  • SessionMiddleware: 세션 관리 기능 제공
  • CommonMiddleware: 공통적인 요청/응답 관련 기능 제공 (예: URL 정규화, WWW 리디렉션)
  • CsrfViewMiddleware: CSRF 보호 기능 제공
  • AuthenticationMiddleware: 사용자 인증 처리
  • MessageMiddleware: Django 메시지 프레임워크 지원
  • XFrameOptionsMiddleware: 클릭재킹(clickjacking) 보호 기능 제공

3. 커스텀 미들웨어 만들기

기본 미들웨어 외에도 Django에서는 사용자 정의(Custom) 미들웨어를 작성할 수 있습니다. 커스텀 미들웨어를 만들기 위해서는 Python 클래스를 작성하고, 특정 메서드를 구현해야 합니다.

3.1 미들웨어 기본 구조

Django의 미들웨어 클래스는 다음과 같은 구조를 가집니다:

class MyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 요청 전 처리
        print("요청이 처리되기 전에 실행됩니다.")

        response = self.get_response(request)

        # 응답 후 처리
        print("응답이 반환된 후 실행됩니다.")

        return response

__init__ 메서드에서는 get_response를 받아서 저장하고, __call__ 메서드에서 요청을 처리하는 로직을 구현합니다.

3.2 커스텀 미들웨어 예제: 요청 로깅 미들웨어

다음은 요청 정보를 로깅하는 미들웨어 예제입니다.

import datetime

class LoggingMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # 요청 정보 로깅
        print(f"[{datetime.datetime.now()}] {request.method} 요청: {request.path}")

        response = self.get_response(request)

        return response

3.3 커스텀 미들웨어 설정하기

작성한 미들웨어를 Django 프로젝트에서 사용하려면 settings.pyMIDDLEWARE 리스트에 추가해야 합니다.

MIDDLEWARE = [
    'myapp.middleware.LoggingMiddleware',  # 커스텀 미들웨어 추가
    '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',
]

4. 미들웨어에서 예외 처리 및 응답 변형하기

미들웨어에서는 요청을 가로채어 특정 조건에서 예외를 발생시키거나, 응답을 변형할 수도 있습니다.

4.1 특정 IP 차단 미들웨어

특정 IP에서의 접근을 차단하는 미들웨어를 만들어 보겠습니다.

from django.http import HttpResponseForbidden

class BlockIPMiddleware:
    BLOCKED_IPS = ['192.168.1.100']

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        ip = request.META.get('REMOTE_ADDR')
        if ip in self.BLOCKED_IPS:
            return HttpResponseForbidden("접근이 차단된 IP입니다.")

        return self.get_response(request)

이제 특정 IP에서의 접근을 차단할 수 있습니다.

4.2 응답을 가로채어 변형하는 미들웨어

모든 HTML 응답의 내용을 변형하는 미들웨어를 작성해 보겠습니다.

from django.utils.deprecation import MiddlewareMixin

class ModifyResponseMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if "text/html" in response.get('Content-Type', ''):
            response.content = response.content.replace(b'Hello', b'안녕하세요')
        return response

이 미들웨어를 사용하면 모든 HTML 응답에서 "Hello"를 "안녕하세요"로 변경할 수 있습니다.


5. 마무리

Django의 미들웨어는 웹 애플리케이션의 요청과 응답을 효과적으로 관리하는 데 매우 유용합니다. 기본적으로 제공되는 미들웨어를 활용하는 것뿐만 아니라, 필요에 따라 커스텀 미들웨어를 만들어 보안, 로깅, 응답 변형 등의 다양한 작업을 수행할 수 있습니다.

이번 포스팅에서는 Django 미들웨어의 개념과 기본 제공 미들웨어, 그리고 커스텀 미들웨어를 만드는 방법까지 살펴보았습니다. 실전 프로젝트에서 필요한 기능을 미들웨어로 구현하여 Django 애플리케이션을 더욱 강력하게 만들어 보시기 바랍니다!

728x90