강력한 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)를 기억하기 위한 방법입니다. 주요 동작 과정은 다음과 같습니다:
- 클라이언트가 서버에 접속하면, 서버가 고유한 session ID를 생성합니다.
- 이 session ID를 클라이언트에게 전달하고, 서버는 이를 기억합니다.
- 클라이언트는 session ID를 쿠키에 저장합니다.
- 이후 요청마다 클라이언트는 쿠키에 저장된 session ID를 서버에 전달합니다.
- 서버는 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
앱에서 관리합니다.
accounts
앱 생성:1
python manage.py startapp accounts
프로젝트의
urls.py
와 연결:1 2 3 4 5
from django.urls import include, path urlpatterns = [ path('accounts/', include('accounts.urls')), ]
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
:
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)
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 %}
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는
AuthenticationForm
과auth_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과 연계하면 사용자를 손쉽게 관리할 수 있습니다.