Python/Django

Django에서 사용자 인증(Authentication) 시스템 구축하기

임베디드 친구 2025. 11. 6. 19:14
반응형

Django에서 사용자 인증(Authentication) 시스템 구축하기

Django는 강력한 인증(Authentication) 시스템을 기본적으로 제공하며, 이를 활용하면 사용자 계정 관리, 로그인, 로그아웃 등을 손쉽게 구현할 수 있습니다. 이번 포스팅에서는 Django의 User 모델을 활용하여 사용자 인증 시스템을 구축하는 방법을 설명하겠습니다.

1. Django의 기본 사용자 모델(User Model)

Django에서는 django.contrib.auth.models.User 클래스를 제공하며, 이를 사용하여 사용자 계정을 관리할 수 있습니다. 기본적으로 아래와 같은 필드를 제공합니다.

  • username: 사용자 이름
  • email: 이메일 주소
  • password: 비밀번호 (해싱되어 저장됨)
  • first_name, last_name: 이름 및 성
  • is_staff, is_active, is_superuser: 사용자 권한 관리
  • date_joined: 가입 날짜

2. Django 인증 시스템 설정

Django 프로젝트에서 기본 인증 시스템을 사용하려면 INSTALLED_APPSMIDDLEWARE 설정을 확인해야 합니다.

2.1 settings.py 설정 확인

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

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',
]

3. 회원가입 기능 구현

회원가입 기능을 만들기 위해 Django의 기본 UserCreationForm을 활용할 수 있습니다.

3.1 forms.py에 사용자 회원가입 폼 생성

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

3.2 views.py에서 회원가입 처리

from django.shortcuts import render, redirect
from django.contrib.auth import login
from .forms import SignUpForm

def signup(request):
    if request.method == "POST":
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

3.3 urls.py에 회원가입 URL 추가

from django.urls import path
from .views import signup

urlpatterns = [
    path('signup/', signup, name='signup'),
]

3.4 signup.html 템플릿 작성

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">가입하기</button>
</form>

4. 로그인 및 로그아웃 기능 구현

Django는 django.contrib.auth 모듈을 통해 로그인 및 로그아웃 기능을 쉽게 제공하며, 이를 활용할 수 있습니다.

4.1 로그인 뷰 구현 (views.py)

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect


def user_login(request):
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('home')
        else:
            return render(request, 'login.html', {'error': 'Invalid credentials'})
    return render(request, 'login.html')


def user_logout(request):
    logout(request)
    return redirect('home')

4.2 로그인 및 로그아웃 URL 추가 (urls.py)

urlpatterns += [
    path('login/', user_login, name='login'),
    path('logout/', user_logout, name='logout'),
]

4.3 로그인 템플릿 (login.html)

<form method="post">
    {% csrf_token %}
    <label for="username">아이디:</label>
    <input type="text" name="username" required>
    <label for="password">비밀번호:</label>
    <input type="password" name="password" required>
    <button type="submit">로그인</button>
</form>
{% if error %}<p>{{ error }}</p>{% endif %}

5. 로그인 상태 표시 및 로그아웃 버튼 추가

Django 템플릿에서 request.user.is_authenticated를 활용하여 로그인 상태를 확인하고 UI를 다르게 렌더링할 수 있습니다.

{% if request.user.is_authenticated %}
    <p>안녕하세요, {{ request.user.username }}님!</p>
    <a href="{% url 'logout' %}">로그아웃</a>
{% else %}
    <a href="{% url 'login' %}">로그인</a>
    <a href="{% url 'signup' %}">회원가입</a>
{% endif %}

6. Django 기본 로그인 뷰 활용하기

Django는 django.contrib.auth.views.LoginView, LogoutView를 제공하여 간편하게 로그인 및 로그아웃을 처리할 수 있습니다.

6.1 urls.py에 기본 로그인/로그아웃 뷰 추가

from django.contrib.auth.views import LoginView, LogoutView

urlpatterns += [
    path('login/', LoginView.as_view(template_name='login.html'), name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),
]

7. 결론

Django에서 제공하는 기본 사용자 인증 시스템을 활용하면 간단한 코드만으로 강력한 사용자 계정 관리 기능을 구현할 수 있습니다. 회원가입, 로그인, 로그아웃 기능을 추가하여 더 나은 사용자 경험을 제공할 수 있습니다. 이후에는 사용자 권한 및 그룹 관리, 소셜 로그인 기능 등을 추가하는 것도 고려해볼 수 있습니다.

반응형