Middleware를 이용한 HTTP 로그인 인증

김의석 ·2024년 4월 19일
0

Django

목록 보기
24/39

Middleware를 통해 HTTP 요청 응답 사이에서 로그인 인증 확인 작업을 추가한다.

  • 지난번 로그인 기능을 구현했으나 말그대로 로그인 기능이였고 프로젝트에서 라우팅 된 다른 url 임의로 접속 시 로그인을 통한 인증 확인이 전혀 이루어지지 않았다!(그림참고)

  • 그래서 Middleware를 통해 로그인 인증을 확인하고 인증 되지 않은 url로 접속 시 로그인 화면으로 이동하게하는 작업을 하려고한다.

Middleware

  • 요약하자면 Middleware는 HTTP 요청과 응답 사이에서 특정 작업 수행이 가능하다.

    • 요청 및 응답처리

      • 로그인 인증을 확인하거나 로깅을 기록한다.
    • 가로채기및 수정

      • 특정조건에 따라 응답을 변경한다.

Middleware를 이용한 HTTP 로그인 인증 확인

Middleware의 사용

  • login을 담당하는 app 디렉토리 내에 middleware.py를 생성하고 다음과 같이 작성한다!
from django.shortcuts import redirect
from django.urls import reverse


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

    def __call__(self, request):
        if not request.user.is_authenticated:
            if not request.path.startswith(reverse("common:login")):
                return redirect(reverse("common:login"))

        response = self.get_response(request)
        return response
  • init()

    • get_response 매개변수를 받아서 인스턴스 변수로 저장한다.
    • get_response는 Django view를 호출하기 위한 객체이다!
  • call()

    • HTTP 요청이 처리될 때 실행되며 요청 처리 전 로그인 인증을 확인한다.
  • request.user.is_authenticated

    • 현재 사용자가 로그인 인증이 되어있는지 확인한다.
  • request.path.startswith(reverse("login"))

    • 만약 사용자가 인증되지 않았고, 요청한 경로가 로그인 페이지가 아니라면, 즉시 로그인 페이지로 리다이렉트한다.
    • startwith() 는 문자열이 특정 문자열로 시작하는지 확인, True/False를 반환한다.
    • reverse는 URL 패턴 이름("common:login")을 사용하여 실제 URL을 생성한다.
    • return redirect(reverse("common:login"))
    • 로그인 페이지로의 리다이렉트를 실행한다.
# common 내의 urls.py

app_name = "common"

   path(
        "login/",
        auth_views.LoginView.as_view(template_name="common/login.html"),
        name="login",
    ),
  • 여기서 주의!
    • common 내의 urls.py에서 app_name = "common"를 지정했기 때문에 반드시 reverse 사용 시 common:login로 명시해준다.
    • 그렇지 않으면 다음과 같은 오류를 만나게 될 것.
    • 친절한 GPT

Settings에 Middleware 등록

MIDDLEWARE = [
    "common.middleware.LoginRequiredMiddleware",
]

로그인 페이지 설정

# middleware login 인증이 아닌 경우 이동하는 URL
LOGIN_URL = "/login"

완성된 로그인!

  • 임의로 다른 url을 입력하여 접속해도 사용자가 로그인 인증이 되지 않는다면 /login으로 리다이렉트된다!
profile
널리 이롭게

0개의 댓글