들어가며
장고에서 로그인, 로그아웃 구현하는 방법은 매우 간단합니다….! 이번 포스트에서는 “장고 로그인 로그아웃” 공부하고 구현한 내용을 정리해 보았습니다.
유저 생성
로그인 기능을 구현하기 위해 admin 사용자를 우선 추가해봅니다. 장고에서 사용자는 크게 3가지 수준이 존재하는데요. admin 사용자 추가를 위해 superuser를 생성해줍니다.
user, staff, superuser 란?
- user
- 사용자 접근의 기본 수준
- 사용자는 부여된 권한에 따라 애플리케이션과 상호 작용할 수 있지만 관리 권한은 없음
- staff
- user에 비해 추가 권한이 존재
- 특정 관리 기능이나 app의 제한된 영역에 접근 가능
- superuser
- Django 애플리케이션에 대한 전체 관리 액세스 권한을 갖음
- 사용자 생성 및 삭제, 권한 관리, 관리 인터페이스의 모든 영역 액세스 가능
superuser 생성
python manage.py createsuperuser # 슈퍼유저 생성
위의 명령어를 입력하면 ID, 비밀번호, 이메일 등을 입력하게 되는데요. admin ID, password는 매우 중요하니까 꼭 기억해야 해주세요.
로그인
계정과 관련된 작업을 처리하기 위해 ‘accounts’ 라는 이름의 app을 추가해보겠습니다.
python manager.py startapp accounts
app을 추가해줬으니 해당 app에 대한 url을 수정해줘야 겠죠?
# urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("articles.urls")),
path("users/", include("users.urls")),
path("accounts/", include("accounts.urls")),
]
# accounts/urls.py
from django.urls import path
from . import views
app_name = "accounts"
urlpatterns = [
path("login/", views.login, name="login"),
]
장고에서는 로그인을 할 수 있게 AuthenticationForm()과 auth_login 메소드를 제공해줍니다.
AuthenticationForm()은 로그인을 해줄 모델과 연결된 Form을 제공해주고요.
auth_login() 메소드는 AuthenticationForm에서 요청 받은 정보를 기반으로 로그인을 구현해줍니다.
# accounts/views.py
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("articles:index ")
else:
form = AuthenticationForm()
context = {"form": form}
return render(request, "accounts/login.html", context)
위에서 AuthenticationForm()은 로그인을 해줄 모델과 연결된 Form을 제공해준다고 말씀 드렸는데요.
우리가 인증과 관련된 모델을 따로 만들지 않아도 auth_user
라는 모델이 이미 만들어져 있는 것을 알 수 있습니다.
AuthenticationForm()은 이 auth_user
과 상호작용하는 form 인 것입니다.
로그인 기능은 홈페이지 상단에 있는 경우가 많기 때문에 base.html에 로그인 링크를 추가해보겠습니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="navbar">
<a href="{% url 'accounts:login'%}">로그인</a>
</div>
<div class="container">
{% block content %}
{% endblock content %}
</div>
</body>
</html>
이제 로그인을 받을 template을 생성해 봅니다. template에서는 view에서 전달해준 AuthenticationForm()을 표기해주면 됩니다. 여기서는 ‘form’ 이름으로 context를 받았기 때문에 form.as_p로 받았습니다.
로그인 정보는 CRUD를 건들기 때문에 GET이 아닌 POST로 넘겨줍니다.
POST 정보로 넘겨주기 때문에 csrf_token을 추가해줍니다.
/accounts/templates/accounts/login.html
{% 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 %}
로그아웃
로그아웃이란 결국 브라우저에서 세션 ID를 지우는 것 입니다.
세션 ID는 request의 쿠키에 담겨져 있습니다. 때문에 해당 쿠키의 세션 ID를 지워주는 로직이 필요합니다.
이 기능은 장고에서 auth_logout 함수로 간편하게 제공해줍니다.
우선 로그아웃 기능 구현을 위해 우선은 logout URL를 추가해줍니다.
from django.urls import path
from . import views
app_name = "accounts"
urlpatterns = [
path("login/", views.login, name="login"),
path("logout/", views.logout, name="logout"),
]
view에서 POST로 받은 요청에 대해서 auth_logout(request)
로 처리하면 request로 받은 쿠키의 세션ID를 삭제해주는 것까지 모두 장고에서 알아서 완료해줍니다.
# accounts/views.py
from django.contrib.auth import logout as auth_logout
def logout(request):
if request.method == "POST":
auth_logout(request)
return redirect("index")
로그인과 마찬가지로 POST 요청이기 때문에 form으로 보내줍니다.
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<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>
<div class="container">
{% block content %}
{% endblock content %}
</div>
</body>
</html>
마치며
정말 간단하게 로그인, 로그아웃 기능을 구현 할 수 있는데요. 사용자 로그인을 위해서 받는 form 내용과 모델 구조 같은 것도 커스터마이즈해서 사용할 수 있습니다. 해당 내용은 다음에 정리해보도록 하겠습니다.
참고하면 좋은 글
공식 document : Using the Django authentication system | Django documentation | Django (djangoproject.com)