💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    10 사용자 인증(Authentication) | ✅ 편저: 코담 운영자

    Django 튜토리얼 #10 - 사용자 인증(Authentication)


    🔗 소스


    1. 강의 목표

    • Django의 인증 시스템을 활용하여 회원가입, 로그인, 로그아웃 기능을 구현한다.
    • 인증된 사용자만 접근 가능한 페이지를 보호하는 방법을 학습한다.
    • LoginRequiredMixin, @login_required, authenticate, login, logout 등 핵심 기능을 익힌다.

    2. 기본 설정

    • django.contrib.auth, django.contrib.sessions 등 인증 관련 앱은 Django에서 기본으로 설정되어 있음
    • settings.py에 사용자 앱 등록 (INSTALLED_APPS'auth_app' 추가)
    • 정적 파일 경로 지정 (예: STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')])

    3. 폼 클래스 정의 (authApp/forms.py)

    사용자 회원가입에 사용할 폼 클래스를 정의하는 파일입니다. User 모델을 기반으로 비밀번호 확인 필드를 추가하고, 검증 로직을 포함합니다.

    from django import forms
    from django.contrib.auth.models import User
    
    # 사용자 회원가입 폼 정의
    class RegisterForm(forms.ModelForm):
        password = forms.CharField(widget=forms.PasswordInput)  # 비밀번호 입력 필드
        password_confirm = forms.CharField(widget=forms.PasswordInput, label="비밀번호 확인")  # 비밀번호 확인 입력 필드
    
        class Meta:
            model = User
            fields  = ['username', 'password', 'password_confirm']
    
        # 비밀번호 일치 여부 검증
        def clean(self):
            cleaned_data = super().clean()
            password = cleaned_data.get('password')
            password_confirm = cleaned_data.get('password_confirm')
    
            if password and password_confirm and password != password_confirm:
                raise forms.ValidationError("비밀번호가 일치하지 않습니다!")
            return cleaned_data
    

    4. 뷰 함수 및 클래스 (authApp/views.py)

    사용자 요청에 따라 회원가입, 로그인, 로그아웃, 인증된 사용자 전용 페이지를 처리하는 함수 및 클래스 기반 뷰를 정의합니다.

    • 주요 import:
    from django.shortcuts import render, redirect  # 템플릿 렌더링 및 리디렉션
    from django.contrib.auth import authenticate, login, logout  # 인증 관련 함수
    from django.contrib.auth.mixins import LoginRequiredMixin  # 클래스 기반 뷰 보호
    from django.contrib.auth.decorators import login_required  # 함수 기반 뷰 보호
    from django.contrib.auth.models import User  # 기본 사용자 모델
    from django.views import View  # 클래스 기반 뷰
    from .forms import RegisterForm  # 회원가입 폼
    ```python
    from django.shortcuts import render, redirect
    from django.contrib.auth import authenticate, login, logout
    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.contrib.auth.models import User
    from django.views import View
    from .forms import RegisterForm
    

    회원가입 뷰

    def register_view(request):
        if request.method == 'POST':
            form = RegisterForm(request.POST)
            if form.is_valid():
                username = form.cleaned_data.get('username')
                password = form.cleaned_data.get('password')
                user = User.objects.create_user(username=username, password=password)
                login(request, user)
                return redirect('home')
        else:
            form = RegisterForm()
        return render(request, 'accounts/register.html', {'form': form})
    

    로그인 뷰

    def login_view(request):
        error_message = ''
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            user = authenticate(request, username=username, password=password)
            if user:
                login(request, user)
                next_url = request.POST.get('next') or request.GET.get('next') or 'home'
                return redirect(next_url)
            else:
                error_message = 'Invalid credentials'
        return render(request, 'accounts/login.html', {'error': error_message})
    

    로그아웃 뷰

    def logout_view(request):
        if request.method == 'POST':
            logout(request)
            return redirect('login')
        return redirect('home')
    

    로그인 필수 홈 뷰

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def home_view(request):
        return render(request, 'home/home.html')
    

    로그인 필수 클래스 기반 뷰 (Protected)

    class ProtectedView(LoginRequiredMixin, View):
        login_url = 'login'
        redirect_field_name = 'next'
    
        def get(self, request):
            return render(request, 'registration/protected.html')
    

    5. 디렉토리 및 템플릿 구조 (authApp/templates/ 하위 구조)

    템플릿 파일은 로그인/회원가입 등 인증 관련 UI를 담당하며, 각각의 기능별 디렉토리에 나뉘어 관리됩니다.

    lesson10-Authentication/
    ├── authProject/
    │   ├── authApp/
    │   │   ├── static/
    │   │   │   └── styles/
    │   │   │       └── styles.css
    │   │   ├── templates/
    │   │   │   ├── accounts/
    │   │   │   │   ├── login.html
    │   │   │   │   ├── logout.html
    │   │   │   │   └── register.html
    │   │   │   ├── auth1_app/
    │   │   │   │   └── home.html
    │   │   │   └── registration/
    │   │   │       └── protected.html
    │   │   ├── forms.py
    │   │   ├── views.py 등...
    │   ├── authProject/
    │   │   ├── settings.py 등...
    │   └── manage.py
    
    • {% load static %} 선언 필수

    • 모든 폼에는 {% csrf_token %} 삽입 필요

    • {% load static %} 선언 필수

    • 각 템플릿에서 {% csrf_token %} 사용


    6. settings.py 추가 설정 (authProject/settings.py)

    로그인 성공 후 리디렉션될 기본 URL을 지정합니다.

    LOGIN_REDIRECT_URL = 'home'
    
    • 로그인 후 기본 리디렉션 URL 지정

    7. URL 연결 (authProject/urls.py, authApp/urls.py)

    프로젝트와 앱 레벨에서 각각 URL 패턴을 정의하여 뷰와 연결합니다.

    프로젝트 urls.py

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('auth_app.urls')),
    ]
    

    앱 urls.py

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.home_view, name='home'),
        path('login/', views.login_view, name='login'),
        path('logout/', views.logout_view, name='logout'),
        path('register/', views.register_view, name='register'),
        path('protected/', views.ProtectedView.as_view(), name='protected'),
    ]
    

    8. 실습 요약

    • RegisterForm을 통해 사용자 생성 시 비밀번호 확인 기능 구현
    • 로그인 시 authenticate()로 사용자 검증 후 login() 처리
    • 로그아웃 시 logout() 호출하여 세션 종료
    • LoginRequiredMixin 또는 @login_required로 보호 페이지 구성

    다음 강의 예고

    • 실제 프로젝트에 인증 시스템 통합 및 Bootstrap 스타일링 적용
    TOP
    preload preload