Post

강력한 Django 인증 시스템: Auth, 쿠키, 세션, 그리고 구현 가이드

Django의 강력한 인증 시스템을 활용하여 웹 애플리케이션의 보안을 강화하는 방법을 다룹니다. Auth, 쿠키, 세션의 개념과 구현 가이드를 포함합니다.

강력한 Django 인증 시스템: Auth, 쿠키, 세션, 그리고 구현 가이드

01. Auth란?

웹 개발에서 빠질 수 없는 요소 중 하나가 Auth(인증)입니다. Django 역시 강력한 인증 시스템을 제공합니다.

settings.py 살펴보기

Django의 인증 시스템은 기본적으로 settings.py 파일에 설정되어 있습니다:

  • django.contrib.auth : 인증의 핵심 로직과 기본 모델 제공
  • django.contrib.contenttypes : 사용자 모델과 권한을 연결

인증(Authentication)과 권한(Authorization)

Auth는 Authentication(인증)Authorization(권한)을 포함합니다:

  • Authentication(인증) : 사용자가 누구인지 확인하는 절차
  • Authorization(권한) : 사용자가 특정 작업을 수행할 수 있는 권한이 있는지 확인하는 절차

02. HTTP와 쿠키(cookie), 세션(session) 필요성

HTTP 특징

웹 통신은 HTTP 방식을 기반으로 이루어집니다. HTTP의 주요 특징은 다음과 같습니다:

  • 비연결 지향(Connectionless) : 요청-응답 후 연결이 종료됩니다.
  • 무상태(Stateless) : 이전 요청의 상태를 기억하지 않습니다. 모든 요청은 독립적입니다.

이러한 특징 때문에 웹에서는 쿠키세션이 필요합니다. 만약 쿠키와 세션이 없다면 매번 로그인을 반복해야 하며, 이는 사용자 경험을 크게 저하시킵니다.

쿠키(Cookie)란?

  • 쿠키는 서버가 브라우저에 전달하는 작은 데이터 조각입니다.
  • 데이터는 Key-Value 형태로 저장되며, 브라우저에 저장된 쿠키는 이후 같은 서버에 보내는 요청마다 함께 전송됩니다.

쿠키의 활용 사례

  • 장바구니 기능: 사용자가 담은 상품 정보를 저장
  • 최근 검색 기록: 맞춤형 광고 제공
  • “오늘 다시 보지 않기” 버튼: 설정 정보를 저장

쿠키와 개인정보 보호

쿠키는 사용자의 검색 기록을 기반으로 맞춤형 광고에 주로 활용됩니다. 이에 따라 개인정보 보호에 대한 우려가 커지고 있습니다:

  • 구글 크롬은 2024년부터 쿠키 제약을 발표하여 광고 시장의 변화를 예고했습니다.

💡 한 줄 정리: 쿠키는 서버가 브라우저에 전달한 데이터를 저장하며, 이후 요청마다 이 데이터를 포함해 서버에 전달합니다.

세션(Session) / 쿠키만으로 부족한 이유

쿠키는 사용자의 로컬에 저장되기 때문에 악의적으로 변조될 가능성이 있습니다. 이를 방지하기 위해 세션이 사용됩니다.

세션의 역할

세션은 서버와 클라이언트 간의 상태(State)를 기억하기 위한 방법입니다. 주요 동작 과정은 다음과 같습니다:

  1. 클라이언트가 서버에 접속하면, 서버가 고유한 session ID를 생성합니다.
  2. session ID를 클라이언트에게 전달하고, 서버는 이를 기억합니다.
  3. 클라이언트는 session ID를 쿠키에 저장합니다.
  4. 이후 요청마다 클라이언트는 쿠키에 저장된 session ID를 서버에 전달합니다.
  5. 서버는 session ID를 검증한 후 요청을 처리합니다.

💡 민감한 정보는 쿠키가 아닌 서버에서 관리하고, 쿠키에는 세션 ID만 저장합니다.

쿠키의 수명

  • 세션 쿠키(Session Cookie) : 브라우저 종료 시 삭제됩니다.
  • 지속 쿠키(Persistent Cookie) : 디스크에 저장되며, 브라우저를 닫거나 재부팅해도 유지됩니다. (단, Max-Age를 설정하여 유효기간을 제한할 수 있습니다.)

Django의 Session과 Auth

Django는 세션과 인증(Auth) 관리를 자동으로 처리합니다. 개발자는 Django의 내장 기능을 활용해 빠르고 안전하게 인증 시스템을 구현할 수 있습니다.

03. Django Authentication System 개요

Django는 인증(Authentication)과 권한(Authorization)을 기본적으로 지원하는 강력한 인증 시스템을 제공합니다. 이 시스템을 통해 로그인, 로그아웃, 회원 가입, 권한 부여 등을 쉽게 구현할 수 있습니다.

💡 Django의 Authentication System은 세션을 기반으로 작동하며, 사용자 인증 및 세션 관리를 자동으로 처리합니다.

Django Authentication System 구현하기

1. accounts 앱 생성 및 URL 연결

인증과 관련된 로직은 일반적으로 별도의 accounts 앱에서 관리합니다.

  1. accounts 앱 생성:

    1
    
     python manage.py startapp accounts
    
  2. 프로젝트의 urls.py와 연결:

    1
    2
    3
    4
    5
    
     from django.urls import include, path
    
     urlpatterns = [
         path('accounts/', include('accounts.urls')),
     ]
    
  3. accounts/urls.py:

    1
    2
    3
    4
    5
    6
    7
    8
    
     from django.urls import path
     from . import views
    
     app_name = "accounts"
     urlpatterns = [
         path("login/", views.login, name="login"),
         path("logout/", views.logout, name="logout"),
     ]
    

2. 로그인 기능 구현

accounts/views.py:

  1. login 뷰 (1차 구현):

    1
    2
    3
    4
    5
    6
    7
    
     from django.shortcuts import render
     from django.contrib.auth.forms import AuthenticationForm
    
     def login(request):
         form = AuthenticationForm()
         context = {"form": form}
         return render(request, "accounts/login.html", context)
    
  2. login 템플릿: accounts/templates/accounts/login.html:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
        
     {% extends "base.html" %}
    
     {% block content %}
     <h1>로그인</h1>
    
     <form action="{% url 'accounts:login' %}" method="POST">
         {% csrf_token %}
         {{ form.as_p }}
         <button type="submit">로그인</button>
     </form>
     {% endblock content %}
        
    
  3. login 뷰 (2차 구현):

    • POST 요청으로 로그인 데이터를 처리하도록 수정:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     from django.shortcuts import render, redirect
     from django.contrib.auth import login as auth_login
     from django.contrib.auth.forms import AuthenticationForm
    
     def login(request):
         if request.method == "POST":
             form = AuthenticationForm(data=request.POST)
             if form.is_valid():
                 auth_login(request, form.get_user())
                 return redirect("index")  # 로그인 후 이동할 페이지
         else:
             form = AuthenticationForm()
         context = {"form": form}
         return render(request, "accounts/login.html", context)
    

💡 Django는 AuthenticationFormauth_login을 제공하여 최소한의 코드로 인증 시스템을 구현할 수 있습니다.

3. 로그아웃 기능 구현

accounts/views.py:

1
2
3
4
5
6
from django.contrib.auth import logout as auth_logout

def logout(request):
    if request.method == "POST":
        auth_logout(request)
    return redirect("index")

accounts/templates/base.html:

  • 로그인/로그아웃 링크 추가:
1
2
3
4
5
6
7
8
9
10
11
12
13
<div class="navbar">
    {% if request.user.is_authenticated %}
        <h3>안녕하세요, {{ user }}님</h3>
        <form action="{% url 'accounts:logout' %}" method="POST">
            {% csrf_token %}
            <input type="submit" value="로그아웃">
        </form>
    {% else %}
        <a href="{% url 'accounts:login' %}">로그인</a>
    {% endif %}
</div>

4. is_authenticated@login_required 활용

is_authenticated

  • 템플릿에서 로그인 여부를 확인할 때 사용:

    1
    2
    3
    4
    5
    6
    7
    
        
      {% if request.user.is_authenticated %}
          <h3>환영합니다, {{ user.username }}!</h3>
      {% else %}
          <a href="{% url 'accounts:login' %}">로그인</a>
      {% endif %}
        
    

@login_required

  • 로그인한 사용자만 특정 뷰에 접근하도록 제한:

    1
    2
    3
    4
    5
    
      from django.contrib.auth.decorators import login_required
    
      @login_required
      def profile(request):
          return render(request, "accounts/profile.html")
    

💡 @login_required 데코레이터는 로그인되지 않은 사용자를 settings.LOGIN_URL에 설정된 경로로 리다이렉트합니다.

5. createsuperuser로 관리자 계정 생성

Django는 기본적으로 관리자를 위한 superuser 생성 명령어를 제공합니다:

1
python manage.py createsuperuser
  • 생성된 superuser 계정은 Django Admin 페이지(http://127.0.0.1:8000/admin/)에 로그인하여 사용자 관리 및 기타 설정 작업을 수행할 수 있습니다.

Django Authentication System 요약

  • Django의 인증 시스템은 로그인/로그아웃, 세션 관리, 사용자 인증을 효율적으로 처리할 수 있도록 설계되었습니다.
  • 제공되는 AuthenticationForm, auth_login, auth_logout, @login_required와 같은 도구를 활용하면 최소한의 코드로 인증 기능을 구현할 수 있습니다.
  • Django Admin과 연계하면 사용자를 손쉽게 관리할 수 있습니다.
This post is licensed under CC BY 4.0 by the author.