{"title":"Django 인증 시스템을 사용","version":"3.1","locale":"ko","docname":"topics/auth/default","url":"/ko/3.1/topics/auth/default/","canonical":"https://djangodocs.dev/ko/3.1/topics/auth/default/","summary":"This document explains the usage of Django’s authentication system in its default configuration. This configuration has evolved to serve the most common project…","html":"<h1>Django 인증 시스템을 사용<a class=\"heading-anchor\" href=\"#using-the-django-authentication-system\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>This document explains the usage of Django’s authentication system in its\ndefault configuration. This configuration has evolved to serve the most common\nproject needs, handling a reasonably wide range of tasks, and has a careful\nimplementation of passwords and permissions. For projects where authentication\nneeds differ from the default, Django supports extensive <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/\"><span class=\"doc\">extension and\ncustomization</span></a> of authentication.</p>\n<p>Django authentication provides both authentication and authorization together\nand is generally referred to as the authentication system, as these features\nare somewhat coupled.</p>\n<section id=\"user-objects\">\n<span id=\"id1\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">사용자</span></code> 객체<a class=\"heading-anchor\" href=\"#user-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> objects are the core of the\nauthentication system. They typically represent the people interacting with\nyour site and are used to enable things like restricting access, registering\nuser profiles, associating content with creators etc. Only one class of user\nexists in Django’s authentication framework, i.e., <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.is_superuser\" title=\"django.contrib.auth.models.User.is_superuser\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">'superusers'</span></code></a> or admin <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.is_staff\" title=\"django.contrib.auth.models.User.is_staff\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">'staff'</span></code></a> users are just user objects with\nspecial attributes set, not different classes of user objects.</p>\n<p>디폴트 사용자의 주요 속성은 :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.username\" title=\"django.contrib.auth.models.User.username\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">username</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.password\" title=\"django.contrib.auth.models.User.password\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">password</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.email\" title=\"django.contrib.auth.models.User.email\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">email</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.first_name\" title=\"django.contrib.auth.models.User.first_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">first_name</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.last_name\" title=\"django.contrib.auth.models.User.last_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">last_name</span></code></a></p></li>\n</ul>\n<p>See the <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">full</span> <span class=\"pre\">API</span> <span class=\"pre\">documentation</span></code></a> for\nfull reference, the documentation that follows is more task oriented.</p>\n<section id=\"creating-users\">\n<span id=\"topics-auth-creating-users\"></span><h3>사용자 생성하기<a class=\"heading-anchor\" href=\"#creating-users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>사용자 생성을 하는 가장 직관적인 방법은 <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.UserManager.create_user\" title=\"django.contrib.auth.models.UserManager.create_user\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">create_user()</span></code></a> 헬퍼함수:: 를 사용하는 것입니다.</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create_user</span><span class=\"p\">(</span><span class=\"s1\">&#39;john&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;lennon@thebeatles.com&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;johnpassword&#39;</span><span class=\"p\">)</span>\n\n<span class=\"go\"># At this point, user is a User object that has already been saved</span>\n<span class=\"go\"># to the database. You can continue to change its attributes</span>\n<span class=\"go\"># if you want to change other fields.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Lennon&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>만약 Django admin 이 설치되어 있다면, :ref:` 사용자를 상호작용적으로 추가&lt;auth-admin&gt;` 할 수 있다.</p>\n</section>\n<section id=\"creating-superusers\">\n<span id=\"topics-auth-creating-superusers\"></span><h3>Superusers 생성하기<a class=\"heading-anchor\" href=\"#creating-superusers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a> 명령어를:: 이용해 superusers 추가하기</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>$ python manage.py createsuperuser --username=joe --email=joe@example.com\n</code></pre></div>\n<p>당신은 프롬프트를 통해 패스워드 입력을  해야할 것 입니다. 패스워드를 입력한 뒤, 사용자가 바로 생성될 것입니다. 만약 <a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#cmdoption-createsuperuser-username\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--username</span></code></a> or <a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#cmdoption-createsuperuser-email\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--email</span></code></a> 옵션들을 사용하지 않으면, 이들의 값을 위해 프롬프트로 물어볼 것입니다.</p>\n</section>\n<section id=\"changing-passwords\">\n<h3>패스워드 변경하기<a class=\"heading-anchor\" href=\"#changing-passwords\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django 는 사용자 모델에 원본 패스워드(일반 텍스트)를 저장하지 않고, 오직 해쉬만 저장합니다. (디테일하게 보기 <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/passwords/\"><span class=\"doc\">비밀번호 조작하기 문서</span></a> ). 이로 인해, 사용자의 패스워드 속성을 직접적으로 조작하려 시도하지 마십시오. 이는 사용자 생성을 위해 헬퍼 함수를 사용하는 이유입니다.</p>\n<p>사용자의 패스워드를 변경하기 위해, 여러 옵션이 있습니다.</p>\n<p><a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#django-admin-changepassword\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">changepassword</span> <span class=\"pre\">*username*</span></code></a> offers a method\nof changing a user’s password from the command line. It prompts you to\nchange the password of a given user which you must enter twice. If\nthey both match, the new password will be changed immediately. If you\ndo not supply a user, the command will attempt to change the password\nwhose username matches the current system user.</p>\n<p>You can also change a password programmatically, using\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.set_password\" title=\"django.contrib.auth.models.User.set_password\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set_password()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">u</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s1\">&#39;john&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">u</span><span class=\"o\">.</span><span class=\"n\">set_password</span><span class=\"p\">(</span><span class=\"s1\">&#39;new password&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">u</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n</code></pre></div>\n<p>If you have the Django admin installed, you can also change user’s passwords\non the <a class=\"reference internal\" href=\"#auth-admin\"><span class=\"std std-ref\">authentication system’s admin pages</span></a>.</p>\n<p>Django also provides <a class=\"reference internal\" href=\"#built-in-auth-views\"><span class=\"std std-ref\">views</span></a> and <a class=\"reference internal\" href=\"#built-in-auth-forms\"><span class=\"std std-ref\">forms</span></a> that may be used to allow users to change their own\npasswords.</p>\n<p>Changing a user’s password will log out all their sessions. See\n<a class=\"reference internal\" href=\"#session-invalidation-on-password-change\"><span class=\"std std-ref\">패스워드 변경시 세션 무효화</span></a> for details.</p>\n</section>\n<section id=\"authenticating-users\">\n<h3>사용자 인증하기<a class=\"heading-anchor\" href=\"#authenticating-users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.authenticate\">\n<span class=\"sig-name descname\"><span class=\"pre\">authenticate</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">credentials</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.authenticate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Use <a class=\"reference internal\" href=\"#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code></a> to verify a set of\ncredentials. It takes credentials as keyword arguments, <code class=\"docutils literal notranslate\"><span class=\"pre\">username</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">password</span></code> for the default case, checks them against each\n<a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#authentication-backends\"><span class=\"std std-ref\">authentication backend</span></a>, and returns a\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> object if the credentials are\nvalid for a backend. If the credentials aren’t valid for any backend or if\na backend raises <a class=\"reference internal\" href=\"/ko/3.1/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a>, it\nreturns <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">authenticate</span>\n<span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">authenticate</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s1\">&#39;john&#39;</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"s1\">&#39;secret&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">if</span> <span class=\"n\">user</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n    <span class=\"c1\"># A backend authenticated the credentials</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"c1\"># No backend authenticated the credentials</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> is an optional <a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> which is\npassed on the <code class=\"docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code> method of the authentication backends.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>This is a low level way to authenticate a set of credentials; for\nexample, it’s used by the\n<a class=\"reference internal\" href=\"/ko/3.1/ref/middleware/#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code></a>. Unless\nyou are writing your own authentication system, you probably won’t use\nthis. Rather if you’re looking for a way to login a user, use the\n<a class=\"reference internal\" href=\"#django.contrib.auth.views.LoginView\" title=\"django.contrib.auth.views.LoginView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LoginView</span></code></a>.</p>\n</aside>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"permissions-and-authorization\">\n<span id=\"topic-authorization\"></span><h2>권한과 인증<a class=\"heading-anchor\" href=\"#permissions-and-authorization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django comes with a built-in permissions system. It provides a way to assign\npermissions to specific users and groups of users.</p>\n<p>그것은 Django 관리자 사이트에 사용 되지만 당신만의 소스코드에 사용할 수도 있다.</p>\n<p>Django 관리자 사이트는 권한을 다음과같이 사용한다:</p>\n<ul class=\"simple\">\n<li><p>Access to view objects is limited to users with the “view” or “change”\npermission for that type of object.</p></li>\n<li><p>Access to view the “add” form and add an object is limited to users with\nthe “add” permission for that type of object.</p></li>\n<li><p>Access to view the change list, view the “change” form and change an\nobject is limited to users with the “change” permission for that type of\nobject.</p></li>\n<li><p>Access to delete an object is limited to users with the “delete”\npermission for that type of object.</p></li>\n</ul>\n<p>Permissions can be set not only per type of object, but also per specific\nobject instance. By using the\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_view_permission\" title=\"django.contrib.admin.ModelAdmin.has_view_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">has_view_permission()</span></code></a>,\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_add_permission\" title=\"django.contrib.admin.ModelAdmin.has_add_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">has_add_permission()</span></code></a>,\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission\" title=\"django.contrib.admin.ModelAdmin.has_change_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">has_change_permission()</span></code></a> and\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_delete_permission\" title=\"django.contrib.admin.ModelAdmin.has_delete_permission\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">has_delete_permission()</span></code></a> methods provided\nby the <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelAdmin</span></code></a> class, it is possible to\ncustomize permissions for different object instances of the same type.</p>\n<p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> objects have two many-to-many\nfields: <code class=\"docutils literal notranslate\"><span class=\"pre\">groups</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">user_permissions</span></code>.\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> objects can access their related\nobjects in the same way as any other <a class=\"reference internal\" href=\"/ko/3.1/topics/db/models/\"><span class=\"doc\">Django model</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">([</span><span class=\"n\">group_list</span><span class=\"p\">])</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">group</span><span class=\"p\">,</span> <span class=\"n\">group</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">group</span><span class=\"p\">,</span> <span class=\"n\">group</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">groups</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">user_permissions</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">([</span><span class=\"n\">permission_list</span><span class=\"p\">])</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">user_permissions</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">permission</span><span class=\"p\">,</span> <span class=\"n\">permission</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">user_permissions</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"n\">permission</span><span class=\"p\">,</span> <span class=\"n\">permission</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"n\">myuser</span><span class=\"o\">.</span><span class=\"n\">user_permissions</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"default-permissions\">\n<h3>디폴트 권한<a class=\"heading-anchor\" href=\"#default-permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code> is listed in your <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>\nsetting, it will ensure that four default permissions – add, change, delete,\nand view – are created for each Django model defined in one of your installed\napplications.</p>\n<p>These permissions will be created when you run <a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a>; the first time you run <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> after adding\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code> to <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>, the default permissions\nwill be created for all previously-installed models, as well as for any new\nmodels being installed at that time. Afterward, it will create default\npermissions for new models each time you run <a class=\"reference internal\" href=\"/ko/3.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a> (the function that creates permissions is connected to the\n<a class=\"reference internal\" href=\"/ko/3.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> signal).</p>\n<p>Assuming you have an application with an\n<a class=\"reference internal\" href=\"/ko/3.1/ref/models/options/#django.db.models.Options.app_label\" title=\"django.db.models.Options.app_label\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">app_label</span></code></a> <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> and a model named <code class=\"docutils literal notranslate\"><span class=\"pre\">Bar</span></code>,\nto test for basic permissions you should use:</p>\n<ul class=\"simple\">\n<li><p>add: <code class=\"docutils literal notranslate\"><span class=\"pre\">user.has_perm('foo.add_bar')</span></code></p></li>\n<li><p>change: <code class=\"docutils literal notranslate\"><span class=\"pre\">user.has_perm('foo.change_bar')</span></code></p></li>\n<li><p>delete: <code class=\"docutils literal notranslate\"><span class=\"pre\">user.has_perm('foo.delete_bar')</span></code></p></li>\n<li><p>view: <code class=\"docutils literal notranslate\"><span class=\"pre\">user.has_perm('foo.view_bar')</span></code></p></li>\n</ul>\n<p>The <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.Permission\" title=\"django.contrib.auth.models.Permission\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Permission</span></code></a> model is rarely accessed\ndirectly.</p>\n</section>\n<section id=\"groups\">\n<h3>그룹<a class=\"heading-anchor\" href=\"#groups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.Group\" title=\"django.contrib.auth.models.Group\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.models.Group</span></code></a> models are a generic way of\ncategorizing users so you can apply permissions, or some other label, to those\nusers. A user can belong to any number of groups.</p>\n<p>A user in a group automatically has the permissions granted to that group. For\nexample, if the group <code class=\"docutils literal notranslate\"><span class=\"pre\">Site</span> <span class=\"pre\">editors</span></code> has the permission\n<code class=\"docutils literal notranslate\"><span class=\"pre\">can_edit_home_page</span></code>, any user in that group will have that permission.</p>\n<p>Beyond permissions, groups are a convenient way to categorize users to give\nthem some label, or extended functionality. For example, you could create a\ngroup <code class=\"docutils literal notranslate\"><span class=\"pre\">'Special</span> <span class=\"pre\">users'</span></code>, and you could write code that could, say, give them\naccess to a members-only portion of your site, or send them members-only email\nmessages.</p>\n</section>\n<section id=\"programmatically-creating-permissions\">\n<h3>프로그래밍적으로 권한 추가하기<a class=\"heading-anchor\" href=\"#programmatically-creating-permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>While <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#custom-permissions\"><span class=\"std std-ref\">custom permissions</span></a> can be defined within\na model’s <code class=\"docutils literal notranslate\"><span class=\"pre\">Meta</span></code> class, you can also create permissions directly. For\nexample, you can create the <code class=\"docutils literal notranslate\"><span class=\"pre\">can_publish</span></code> permission for a <code class=\"docutils literal notranslate\"><span class=\"pre\">BlogPost</span></code> model\nin <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BlogPost</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Permission</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentType</span>\n\n<span class=\"n\">content_type</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">BlogPost</span><span class=\"p\">)</span>\n<span class=\"n\">permission</span> <span class=\"o\">=</span> <span class=\"n\">Permission</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n    <span class=\"n\">codename</span><span class=\"o\">=</span><span class=\"s1\">&#39;can_publish&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Can Publish Posts&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"n\">content_type</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>The permission can then be assigned to a\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> via its <code class=\"docutils literal notranslate\"><span class=\"pre\">user_permissions</span></code>\nattribute or to a <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.Group\" title=\"django.contrib.auth.models.Group\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Group</span></code></a> via its\n<code class=\"docutils literal notranslate\"><span class=\"pre\">permissions</span></code> attribute.</p>\n<aside class=\"admonition-proxy-models-need-their-own-content-type admonition\">\n<p class=\"admonition-title\">프록시 모델은 자체 컨텐츠 유형이 필요합니다</p>\n<p>If you want to create <a class=\"reference internal\" href=\"#proxy-models-permissions-topic\"><span class=\"std std-ref\">permissions for a proxy model</span></a>, pass <code class=\"docutils literal notranslate\"><span class=\"pre\">for_concrete_model=False</span></code> to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/contenttypes/#django.contrib.contenttypes.models.ContentTypeManager.get_for_model\" title=\"django.contrib.contenttypes.models.ContentTypeManager.get_for_model\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ContentTypeManager.get_for_model()</span></code></a> to get the appropriate\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ContentType</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">content_type</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">BlogPostProxy</span><span class=\"p\">,</span> <span class=\"n\">for_concrete_model</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"permission-caching\">\n<h3>권한 캐싱<a class=\"heading-anchor\" href=\"#permission-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.backends.ModelBackend\" title=\"django.contrib.auth.backends.ModelBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code></a> caches permissions on\nthe user object after the first time they need to be fetched for a permissions\ncheck. This is typically fine for the request-response cycle since permissions\naren’t typically checked immediately after they are added (in the admin, for\nexample). If you are adding permissions and checking them immediately\nafterward, in a test or view for example, the easiest solution is to re-fetch\nthe user from the database. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Permission</span><span class=\"p\">,</span> <span class=\"n\">User</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.contenttypes.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentType</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_object_or_404</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">BlogPost</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">user_gains_perms</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">user_id</span><span class=\"p\">):</span>\n    <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">get_object_or_404</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">user_id</span><span class=\"p\">)</span>\n    <span class=\"c1\"># any permission check will cache the current set of permissions</span>\n    <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s1\">&#39;myapp.change_blogpost&#39;</span><span class=\"p\">)</span>\n\n    <span class=\"n\">content_type</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">BlogPost</span><span class=\"p\">)</span>\n    <span class=\"n\">permission</span> <span class=\"o\">=</span> <span class=\"n\">Permission</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span>\n        <span class=\"n\">codename</span><span class=\"o\">=</span><span class=\"s1\">&#39;change_blogpost&#39;</span><span class=\"p\">,</span>\n        <span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"n\">content_type</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">user_permissions</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">permission</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Checking the cached permission set</span>\n    <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s1\">&#39;myapp.change_blogpost&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># False</span>\n\n    <span class=\"c1\"># Request new instance of User</span>\n    <span class=\"c1\"># Be aware that user.refresh_from_db() won&#39;t clear the cache.</span>\n    <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">get_object_or_404</span><span class=\"p\">(</span><span class=\"n\">User</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">user_id</span><span class=\"p\">)</span>\n\n    <span class=\"c1\"># Permission cache is repopulated from the database</span>\n    <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s1\">&#39;myapp.change_blogpost&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># True</span>\n\n    <span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"proxy-models\">\n<span id=\"proxy-models-permissions-topic\"></span><h3>대리 모델 (Proxy Model )<a class=\"heading-anchor\" href=\"#proxy-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Proxy models work exactly the same way as concrete models. Permissions are\ncreated using the own content type of the proxy model. Proxy models don’t\ninherit the permissions of the concrete model they subclass:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">permissions</span> <span class=\"o\">=</span> <span class=\"p\">[(</span><span class=\"s1\">&#39;can_eat_pizzas&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Can eat pizzas&#39;</span><span class=\"p\">)]</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Student</span><span class=\"p\">(</span><span class=\"n\">Person</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">proxy</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n        <span class=\"n\">permissions</span> <span class=\"o\">=</span> <span class=\"p\">[(</span><span class=\"s1\">&#39;can_deliver_pizzas&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Can deliver pizzas&#39;</span><span class=\"p\">)]</span>\n\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"c1\"># Fetch the content type for the proxy model.</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">content_type</span> <span class=\"o\">=</span> <span class=\"n\">ContentType</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get_for_model</span><span class=\"p\">(</span><span class=\"n\">Student</span><span class=\"p\">,</span> <span class=\"n\">for_concrete_model</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">student_permissions</span> <span class=\"o\">=</span> <span class=\"n\">Permission</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">content_type</span><span class=\"o\">=</span><span class=\"n\">content_type</span><span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"p\">[</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">codename</span> <span class=\"k\">for</span> <span class=\"n\">p</span> <span class=\"ow\">in</span> <span class=\"n\">student_permissions</span><span class=\"p\">]</span>\n<span class=\"p\">[</span><span class=\"s1\">&#39;add_student&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;change_student&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;delete_student&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;view_student&#39;</span><span class=\"p\">,</span>\n<span class=\"s1\">&#39;can_deliver_pizzas&#39;</span><span class=\"p\">]</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"k\">for</span> <span class=\"n\">permission</span> <span class=\"ow\">in</span> <span class=\"n\">student_permissions</span><span class=\"p\">:</span>\n<span class=\"o\">...</span>     <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">user_permissions</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">permission</span><span class=\"p\">)</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s1\">&#39;app.add_person&#39;</span><span class=\"p\">)</span>\n<span class=\"kc\">False</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perm</span><span class=\"p\">(</span><span class=\"s1\">&#39;app.can_eat_pizzas&#39;</span><span class=\"p\">)</span>\n<span class=\"kc\">False</span>\n<span class=\"o\">&gt;&gt;&gt;</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">has_perms</span><span class=\"p\">((</span><span class=\"s1\">&#39;app.add_student&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;app.can_deliver_pizzas&#39;</span><span class=\"p\">))</span>\n<span class=\"kc\">True</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"authentication-in-web-requests\">\n<span id=\"auth-web-requests\"></span><h2>웹 요청의 인증<a class=\"heading-anchor\" href=\"#authentication-in-web-requests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django uses <a class=\"reference internal\" href=\"/ko/3.1/topics/http/sessions/\"><span class=\"doc\">sessions</span></a> and middleware to hook the\nauthentication system into <a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">request</span> <span class=\"pre\">objects</span></code></a>.</p>\n<p>These provide a <a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.user\" title=\"django.http.HttpRequest.user\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.user</span></code></a>  attribute\non every request which represents the current user. If the current user has not\nlogged in, this attribute will be set to an instance\nof <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.AnonymousUser\" title=\"django.contrib.auth.models.AnonymousUser\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AnonymousUser</span></code></a>, otherwise it will be an\ninstance of <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>.</p>\n<p>You can tell them apart with\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.is_authenticated\" title=\"django.contrib.auth.models.User.is_authenticated\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">is_authenticated</span></code></a>, like so:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_authenticated</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Do something for authenticated users.</span>\n    <span class=\"o\">...</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Do something for anonymous users.</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<section id=\"how-to-log-a-user-in\">\n<span id=\"id2\"></span><h3>사용자가 로그인 하는법<a class=\"heading-anchor\" href=\"#how-to-log-a-user-in\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you have an authenticated user you want to attach to the current session\n- this is done with a <a class=\"reference internal\" href=\"#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login()</span></code></a> function.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.login\">\n<span class=\"sig-name descname\"><span class=\"pre\">login</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">user</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">backend</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.login\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>To log a user in, from a view, use <a class=\"reference internal\" href=\"#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login()</span></code></a>. It\ntakes an <a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> object and a\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> object.\n<a class=\"reference internal\" href=\"#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login()</span></code></a> saves the user’s ID in the session,\nusing Django’s session framework.</p>\n<p>Note that any data set during the anonymous session is retained in the\nsession after a user logs in.</p>\n<p>This example shows how you might use both\n<a class=\"reference internal\" href=\"#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code></a> and\n<a class=\"reference internal\" href=\"#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login()</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">authenticate</span><span class=\"p\">,</span> <span class=\"n\">login</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">username</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s1\">&#39;username&#39;</span><span class=\"p\">]</span>\n    <span class=\"n\">password</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">[</span><span class=\"s1\">&#39;password&#39;</span><span class=\"p\">]</span>\n    <span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">authenticate</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">username</span><span class=\"o\">=</span><span class=\"n\">username</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"n\">password</span><span class=\"p\">)</span>\n    <span class=\"k\">if</span> <span class=\"n\">user</span> <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n        <span class=\"n\">login</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">user</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Redirect to a success page.</span>\n        <span class=\"o\">...</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"c1\"># Return an &#39;invalid login&#39; error message.</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n<section id=\"selecting-the-authentication-backend\">\n<h4>Selecting the authentication backend<a class=\"heading-anchor\" href=\"#selecting-the-authentication-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When a user logs in, the user’s ID and the backend that was used for\nauthentication are saved in the user’s session. This allows the same\n<a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#authentication-backends\"><span class=\"std std-ref\">authentication backend</span></a> to fetch the user’s\ndetails on a future request. The authentication backend to save in the session\nis selected as follows:</p>\n<ol class=\"arabic simple\">\n<li><p>Use the value of the optional <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> argument, if provided.</p></li>\n<li><p>Use the value of the <code class=\"docutils literal notranslate\"><span class=\"pre\">user.backend</span></code> attribute, if present. This allows\npairing <a class=\"reference internal\" href=\"#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code></a> and\n<a class=\"reference internal\" href=\"#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login()</span></code></a>:\n<a class=\"reference internal\" href=\"#django.contrib.auth.authenticate\" title=\"django.contrib.auth.authenticate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">authenticate()</span></code></a>\nsets the <code class=\"docutils literal notranslate\"><span class=\"pre\">user.backend</span></code> attribute on the user object it returns.</p></li>\n<li><p>Use the <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> in <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a>, if there is only\none.</p></li>\n<li><p>Otherwise, raise an exception.</p></li>\n</ol>\n<p>In cases 1 and 2, the value of the <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> argument or the <code class=\"docutils literal notranslate\"><span class=\"pre\">user.backend</span></code>\nattribute should be a dotted import path string (like that found in\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a>), not the actual backend class.</p>\n</section>\n</section>\n<section id=\"how-to-log-a-user-out\">\n<h3>사용자가 로그아웃 하는법<a class=\"heading-anchor\" href=\"#how-to-log-a-user-out\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.logout\">\n<span class=\"sig-name descname\"><span class=\"pre\">logout</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.logout\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>To log out a user who has been logged in via\n<a class=\"reference internal\" href=\"#django.contrib.auth.login\" title=\"django.contrib.auth.login\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.login()</span></code></a>, use\n<a class=\"reference internal\" href=\"#django.contrib.auth.logout\" title=\"django.contrib.auth.logout\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.logout()</span></code></a> within your view. It takes an\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> object and has no return value.\nExample:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">logout</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">logout_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">logout</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n    <span class=\"c1\"># Redirect to a success page.</span>\n</code></pre></div>\n<p>Note that <a class=\"reference internal\" href=\"#django.contrib.auth.logout\" title=\"django.contrib.auth.logout\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">logout()</span></code></a> doesn’t throw any errors if\nthe user wasn’t logged in.</p>\n<p>When you call <a class=\"reference internal\" href=\"#django.contrib.auth.logout\" title=\"django.contrib.auth.logout\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">logout()</span></code></a>, the session data for\nthe current request is completely cleaned out. All existing data is\nremoved. This is to prevent another person from using the same Web browser\nto log in and have access to the previous user’s session data. If you want\nto put anything into the session that will be available to the user\nimmediately after logging out, do that <em>after</em> calling\n<a class=\"reference internal\" href=\"#django.contrib.auth.logout\" title=\"django.contrib.auth.logout\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.logout()</span></code></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"limiting-access-to-logged-in-users\">\n<h3>로그인한 사용자의 접근 제한하기<a class=\"heading-anchor\" href=\"#limiting-access-to-logged-in-users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"the-raw-way\">\n<h4>기본 방법<a class=\"heading-anchor\" href=\"#the-raw-way\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The raw way to limit access to pages is to check\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.is_authenticated\" title=\"django.contrib.auth.models.User.is_authenticated\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.user.is_authenticated</span></code></a> and either redirect to a\nlogin page:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">redirect</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_authenticated</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">redirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\">?next=</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">LOGIN_URL</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"p\">))</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<p>…or display an error message:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_authenticated</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;myapp/login_error.html&#39;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</section>\n<section id=\"the-login-required-decorator\">\n<h4>The <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> decorator<a class=\"heading-anchor\" href=\"#the-login-required-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.decorators.login_required\">\n<span class=\"sig-name descname\"><span class=\"pre\">login_required</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">redirect_field_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'next'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">login_url</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.decorators.login_required\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>As a shortcut, you can use the convenient\n<a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> decorator:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span>\n\n<span class=\"nd\">@login_required</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> does the following:</p>\n<ul class=\"simple\">\n<li><p>If the user isn’t logged in, redirect to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a>, passing the current absolute\npath in the query string. Example: <code class=\"docutils literal notranslate\"><span class=\"pre\">/accounts/login/?next=/polls/3/</span></code>.</p></li>\n<li><p>If the user is logged in, execute the view normally. The view code is\nfree to assume the user is logged in.</p></li>\n</ul>\n<p>By default, the path that the user should be redirected to upon\nsuccessful authentication is stored in a query string parameter called\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;next&quot;</span></code>. If you would prefer to use a different name for this parameter,\n<a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> takes an\noptional <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code> parameter:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span>\n\n<span class=\"nd\">@login_required</span><span class=\"p\">(</span><span class=\"n\">redirect_field_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;my_redirect_field&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Note that if you provide a value to <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code>, you will most\nlikely need to customize your login template as well, since the template\ncontext variable which stores the redirect path will use the value of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code> as its key rather than <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;next&quot;</span></code> (the default).</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> also takes an\noptional <code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code> parameter. Example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span>\n\n<span class=\"nd\">@login_required</span><span class=\"p\">(</span><span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s1\">&#39;/accounts/login/&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Note that if you don’t specify the <code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code> parameter, you’ll need to\nensure that the <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a> and your login\nview are properly associated. For example, using the defaults, add the\nfollowing lines to your URLconf:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">auth_views</span>\n\n<span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;accounts/login/&#39;</span><span class=\"p\">,</span> <span class=\"n\">auth_views</span><span class=\"o\">.</span><span class=\"n\">LoginView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n</code></pre></div>\n<p>The <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a> also accepts view function\nnames and <a class=\"reference internal\" href=\"/ko/3.1/topics/http/urls/#naming-url-patterns\"><span class=\"std std-ref\">named URL patterns</span></a>. This allows you\nto freely remap your login view within your URLconf without having to\nupdate the setting.</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> decorator does NOT check the <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> flag on a\nuser, but the default <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a> reject inactive\nusers.</p>\n</aside>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">더 보기</p>\n<p>If you are writing custom views for Django’s admin (or need the same\nauthorization check that the built-in views use), you may find the\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/admin/#django.contrib.admin.views.decorators.staff_member_required\" title=\"django.contrib.admin.views.decorators.staff_member_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.contrib.admin.views.decorators.staff_member_required()</span></code></a>\ndecorator a useful alternative to <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required()</span></code>.</p>\n</aside>\n</section>\n<section id=\"the-loginrequired-mixin\">\n<h4>The <code class=\"docutils literal notranslate\"><span class=\"pre\">LoginRequired</span></code> mixin<a class=\"heading-anchor\" href=\"#the-loginrequired-mixin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When using <a class=\"reference internal\" href=\"/ko/3.1/topics/class-based-views/\"><span class=\"doc\">class-based views</span></a>, you can\nachieve the same behavior as with <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> by using the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">LoginRequiredMixin</span></code>. This mixin should be at the leftmost position in the\ninheritance list.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.LoginRequiredMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LoginRequiredMixin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.LoginRequiredMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>If a view is using this mixin, all requests by non-authenticated users will\nbe redirected to the login page or shown an HTTP 403 Forbidden error,\ndepending on the\n<a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.raise_exception\" title=\"django.contrib.auth.mixins.AccessMixin.raise_exception\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code></a> parameter.</p>\n<p>You can set any of the parameters of\n<a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin\" title=\"django.contrib.auth.mixins.AccessMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AccessMixin</span></code></a> to customize the handling\nof unauthorized users:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.mixins</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LoginRequiredMixin</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyView</span><span class=\"p\">(</span><span class=\"n\">LoginRequiredMixin</span><span class=\"p\">,</span> <span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"n\">login_url</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;/login/&#39;</span>\n    <span class=\"n\">redirect_field_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;redirect_to&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>Just as the <code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> decorator, this mixin does NOT check the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> flag on a user, but the default\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a> reject inactive users.</p>\n</aside>\n</section>\n<section id=\"limiting-access-to-logged-in-users-that-pass-a-test\">\n<h4>Limiting access to logged-in users that pass a test<a class=\"heading-anchor\" href=\"#limiting-access-to-logged-in-users-that-pass-a-test\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>To limit access based on certain permissions or some other test, you’d do\nessentially the same thing as described in the previous section.</p>\n<p>You can run your test on <a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.user\" title=\"django.http.HttpRequest.user\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.user</span></code></a> in\nthe view directly. For example, this view checks to make sure the user has an\nemail in the desired domain and if not, redirects to the login page:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">redirect</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"o\">.</span><span class=\"n\">endswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;@example.com&#39;</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">redirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/login/?next=</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.decorators.user_passes_test\">\n<span class=\"sig-name descname\"><span class=\"pre\">user_passes_test</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_func</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">login_url</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">redirect_field_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'next'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.decorators.user_passes_test\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>As a shortcut, you can use the convenient <code class=\"docutils literal notranslate\"><span class=\"pre\">user_passes_test</span></code> decorator\nwhich performs a redirect when the callable returns <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">user_passes_test</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">email_check</span><span class=\"p\">(</span><span class=\"n\">user</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"o\">.</span><span class=\"n\">endswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;@example.com&#39;</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@user_passes_test</span><span class=\"p\">(</span><span class=\"n\">email_check</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.decorators.user_passes_test\" title=\"django.contrib.auth.decorators.user_passes_test\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">user_passes_test()</span></code></a> takes a required\nargument: a callable that takes a\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> object and returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if\nthe user is allowed to view the page. Note that\n<a class=\"reference internal\" href=\"#django.contrib.auth.decorators.user_passes_test\" title=\"django.contrib.auth.decorators.user_passes_test\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">user_passes_test()</span></code></a> does not\nautomatically check that the <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a> is\nnot anonymous.</p>\n<p><a class=\"reference internal\" href=\"#django.contrib.auth.decorators.user_passes_test\" title=\"django.contrib.auth.decorators.user_passes_test\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">user_passes_test()</span></code></a> takes two\noptional arguments:</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code></dt><dd><p>Lets you specify the URL that users who don’t pass the test will be\nredirected to. It may be a login page and defaults to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a> if you don’t specify one.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code></dt><dd><p>Same as for <a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a>.\nSetting it to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> removes it from the URL, which you may want to do\nif you are redirecting users that don’t pass the test to a non-login\npage where there’s no “next page”.</p>\n</dd>\n</dl>\n<p>예시:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@user_passes_test</span><span class=\"p\">(</span><span class=\"n\">email_check</span><span class=\"p\">,</span> <span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s1\">&#39;/login/&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.UserPassesTestMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">UserPassesTestMixin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.UserPassesTestMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>When using <a class=\"reference internal\" href=\"/ko/3.1/topics/class-based-views/\"><span class=\"doc\">class-based views</span></a>, you\ncan use the <code class=\"docutils literal notranslate\"><span class=\"pre\">UserPassesTestMixin</span></code> to do this.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.UserPassesTestMixin.test_func\">\n<span class=\"sig-name descname\"><span class=\"pre\">test_func</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.UserPassesTestMixin.test_func\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>You have to override the <code class=\"docutils literal notranslate\"><span class=\"pre\">test_func()</span></code> method of the class to\nprovide the test that is performed. Furthermore, you can set any of the\nparameters of <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin\" title=\"django.contrib.auth.mixins.AccessMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AccessMixin</span></code></a> to\ncustomize the handling of unauthorized users:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.mixins</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UserPassesTestMixin</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyView</span><span class=\"p\">(</span><span class=\"n\">UserPassesTestMixin</span><span class=\"p\">,</span> <span class=\"n\">View</span><span class=\"p\">):</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_func</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"o\">.</span><span class=\"n\">endswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;@example.com&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.UserPassesTestMixin.get_test_func\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_test_func</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.UserPassesTestMixin.get_test_func\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>You can also override the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_test_func()</span></code> method to have the mixin\nuse a differently named function for its checks (instead of\n<a class=\"reference internal\" href=\"#django.contrib.auth.mixins.UserPassesTestMixin.test_func\" title=\"django.contrib.auth.mixins.UserPassesTestMixin.test_func\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">test_func()</span></code></a>).</p>\n</dd></dl>\n\n<aside class=\"admonition-stacking-userpassestestmixin admonition\">\n<p class=\"admonition-title\">Stacking <code class=\"docutils literal notranslate\"><span class=\"pre\">UserPassesTestMixin</span></code></p>\n<p>Due to the way <code class=\"docutils literal notranslate\"><span class=\"pre\">UserPassesTestMixin</span></code> is implemented, you cannot stack\nthem in your inheritance list. The following does NOT work:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestMixin1</span><span class=\"p\">(</span><span class=\"n\">UserPassesTestMixin</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_func</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">email</span><span class=\"o\">.</span><span class=\"n\">endswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;@example.com&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestMixin2</span><span class=\"p\">(</span><span class=\"n\">UserPassesTestMixin</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_func</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">username</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;django&#39;</span><span class=\"p\">)</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyView</span><span class=\"p\">(</span><span class=\"n\">TestMixin1</span><span class=\"p\">,</span> <span class=\"n\">TestMixin2</span><span class=\"p\">,</span> <span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">TestMixin1</span></code> would call <code class=\"docutils literal notranslate\"><span class=\"pre\">super()</span></code> and take that result into\naccount, <code class=\"docutils literal notranslate\"><span class=\"pre\">TestMixin1</span></code> wouldn’t work standalone anymore.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"the-permission-required-decorator\">\n<h4>The <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</span></code> decorator<a class=\"heading-anchor\" href=\"#the-permission-required-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.decorators.permission_required\">\n<span class=\"sig-name descname\"><span class=\"pre\">permission_required</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">perm</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">login_url</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raise_exception</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.decorators.permission_required\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>It’s a relatively common task to check whether a user has a particular\npermission. For that reason, Django provides a shortcut for that case: the\n<a class=\"reference internal\" href=\"#django.contrib.auth.decorators.permission_required\" title=\"django.contrib.auth.decorators.permission_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">permission_required()</span></code></a> decorator.:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">permission_required</span>\n\n<span class=\"nd\">@permission_required</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls.add_choice&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Just like the <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.has_perm\" title=\"django.contrib.auth.models.User.has_perm\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">has_perm()</span></code></a> method,\npermission names take the form <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;&lt;app</span> <span class=\"pre\">label&gt;.&lt;permission</span> <span class=\"pre\">codename&gt;&quot;</span></code>\n(i.e. <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.add_choice</span></code> for a permission on a model in the <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>\napplication).</p>\n<p>The decorator may also take an iterable of permissions, in which case the\nuser must have all of the permissions in order to access the view.</p>\n<p>Note that <a class=\"reference internal\" href=\"#django.contrib.auth.decorators.permission_required\" title=\"django.contrib.auth.decorators.permission_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">permission_required()</span></code></a>\nalso takes an optional <code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code> parameter:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">permission_required</span>\n\n<span class=\"nd\">@permission_required</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls.add_choice&#39;</span><span class=\"p\">,</span> <span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s1\">&#39;/loginpage/&#39;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>As in the <a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> decorator,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code> defaults to <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a>.</p>\n<p>If the <code class=\"docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code> parameter is given, the decorator will raise\n<a class=\"reference internal\" href=\"/ko/3.1/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a>, prompting <a class=\"reference internal\" href=\"/ko/3.1/ref/views/#http-forbidden-view\"><span class=\"std std-ref\">the 403\n(HTTP Forbidden) view</span></a> instead of redirecting to the\nlogin page.</p>\n<p>If you want to use <code class=\"docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code> but also give your users a chance to\nlogin first, you can add the\n<a class=\"reference internal\" href=\"#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> decorator:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span><span class=\"p\">,</span> <span class=\"n\">permission_required</span>\n\n<span class=\"nd\">@login_required</span>\n<span class=\"nd\">@permission_required</span><span class=\"p\">(</span><span class=\"s1\">&#39;polls.add_choice&#39;</span><span class=\"p\">,</span> <span class=\"n\">raise_exception</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>This also avoids a redirect loop when <a class=\"reference internal\" href=\"#django.contrib.auth.views.LoginView\" title=\"django.contrib.auth.views.LoginView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LoginView</span></code></a>’s\n<code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_authenticated_user=True</span></code> and the logged-in user doesn’t have\nall of the required permissions.</p>\n</dd></dl>\n\n</section>\n<section id=\"the-permissionrequiredmixin-mixin\">\n<h4>The <code class=\"docutils literal notranslate\"><span class=\"pre\">PermissionRequiredMixin</span></code> mixin<a class=\"heading-anchor\" href=\"#the-permissionrequiredmixin-mixin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>To apply permission checks to <a class=\"reference internal\" href=\"/ko/3.1/ref/class-based-views/\"><span class=\"doc\">class-based views</span></a>, you can use the <code class=\"docutils literal notranslate\"><span class=\"pre\">PermissionRequiredMixin</span></code>:</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.PermissionRequiredMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PermissionRequiredMixin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.PermissionRequiredMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This mixin, just like the <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</span></code>\ndecorator, checks whether the user accessing a view has all given\npermissions. You should specify the permission (or an iterable of\npermissions) using the <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</span></code> parameter:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.mixins</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">PermissionRequiredMixin</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyView</span><span class=\"p\">(</span><span class=\"n\">PermissionRequiredMixin</span><span class=\"p\">,</span> <span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"n\">permission_required</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;polls.add_choice&#39;</span>\n    <span class=\"c1\"># Or multiple of permissions:</span>\n    <span class=\"n\">permission_required</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"s1\">&#39;polls.view_choice&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;polls.change_choice&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>You can set any of the parameters of\n<a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin\" title=\"django.contrib.auth.mixins.AccessMixin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AccessMixin</span></code></a> to customize the handling\nof unauthorized users.</p>\n<p>You may also override these methods:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.PermissionRequiredMixin.get_permission_required\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_permission_required</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.PermissionRequiredMixin.get_permission_required\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns an iterable of permission names used by the mixin. Defaults to\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</span></code> attribute, converted to a tuple if\nnecessary.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.PermissionRequiredMixin.has_permission\">\n<span class=\"sig-name descname\"><span class=\"pre\">has_permission</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.PermissionRequiredMixin.has_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns a boolean denoting whether the current user has permission to\nexecute the decorated view. By default, this returns the result of\ncalling <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.has_perms\" title=\"django.contrib.auth.models.User.has_perms\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">has_perms()</span></code></a> with the\nlist of permissions returned by <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.PermissionRequiredMixin.get_permission_required\" title=\"django.contrib.auth.mixins.PermissionRequiredMixin.get_permission_required\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_permission_required()</span></code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>\n</section>\n<section id=\"redirecting-unauthorized-requests-in-class-based-views\">\n<h3>Redirecting unauthorized requests in class-based views<a class=\"heading-anchor\" href=\"#redirecting-unauthorized-requests-in-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To ease the handling of access restrictions in <a class=\"reference internal\" href=\"/ko/3.1/ref/class-based-views/\"><span class=\"doc\">class-based views</span></a>, the <code class=\"docutils literal notranslate\"><span class=\"pre\">AccessMixin</span></code> can be used to configure\nthe behavior of a view when access is denied. Authenticated users are denied\naccess with an HTTP 403 Forbidden response. Anonymous users are redirected to\nthe login page or shown an HTTP 403 Forbidden response, depending on the\n<a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.raise_exception\" title=\"django.contrib.auth.mixins.AccessMixin.raise_exception\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code></a> attribute.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AccessMixin</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.login_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">login_url</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.login_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Default return value for <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.get_login_url\" title=\"django.contrib.auth.mixins.AccessMixin.get_login_url\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_login_url()</span></code></a>.  Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>\nin which case <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.get_login_url\" title=\"django.contrib.auth.mixins.AccessMixin.get_login_url\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_login_url()</span></code></a> falls back to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.permission_denied_message\">\n<span class=\"sig-name descname\"><span class=\"pre\">permission_denied_message</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.permission_denied_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Default return value for <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.get_permission_denied_message\" title=\"django.contrib.auth.mixins.AccessMixin.get_permission_denied_message\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_permission_denied_message()</span></code></a>.\nDefaults to an empty string.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.redirect_field_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">redirect_field_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.redirect_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Default return value for <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.get_redirect_field_name\" title=\"django.contrib.auth.mixins.AccessMixin.get_redirect_field_name\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_redirect_field_name()</span></code></a>. Defaults to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;next&quot;</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.raise_exception\">\n<span class=\"sig-name descname\"><span class=\"pre\">raise_exception</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.raise_exception\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>If this attribute is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, a\n<a class=\"reference internal\" href=\"/ko/3.1/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a> exception is raised\nwhen the conditions are not met.  When <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> (the default),\nanonymous users are redirected to the login page.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.get_login_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_login_url</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.get_login_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns the URL that users who don’t pass the test will be redirected\nto. Returns <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.login_url\" title=\"django.contrib.auth.mixins.AccessMixin.login_url\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">login_url</span></code></a> if set, or <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a> otherwise.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.get_permission_denied_message\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_permission_denied_message</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.get_permission_denied_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>When <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.raise_exception\" title=\"django.contrib.auth.mixins.AccessMixin.raise_exception\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code></a> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, this method can be used to\ncontrol the error message passed to the error handler for display to\nthe user. Returns the <a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.permission_denied_message\" title=\"django.contrib.auth.mixins.AccessMixin.permission_denied_message\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">permission_denied_message</span></code></a> attribute by\ndefault.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.get_redirect_field_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_redirect_field_name</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.get_redirect_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns the name of the query parameter that will contain the URL the\nuser should be redirected to after a successful login. If you set this\nto <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, a query parameter won’t be added. Returns the\n<a class=\"reference internal\" href=\"#django.contrib.auth.mixins.AccessMixin.redirect_field_name\" title=\"django.contrib.auth.mixins.AccessMixin.redirect_field_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code></a> attribute by default.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.mixins.AccessMixin.handle_no_permission\">\n<span class=\"sig-name descname\"><span class=\"pre\">handle_no_permission</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.mixins.AccessMixin.handle_no_permission\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Depending on the value of <code class=\"docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code>, the method either raises\na <a class=\"reference internal\" href=\"/ko/3.1/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a> exception or\nredirects the user to the <code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code>, optionally including the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code> if it is set.</p>\n</dd></dl>\n\n</dd></dl>\n\n<section id=\"session-invalidation-on-password-change\">\n<span id=\"id3\"></span><h4>패스워드 변경시 세션 무효화<a class=\"heading-anchor\" href=\"#session-invalidation-on-password-change\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>If your <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-AUTH_USER_MODEL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTH_USER_MODEL</span></code></a> inherits from\n<a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AbstractBaseUser</span></code></a> or implements its own\n<a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash\" title=\"django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_session_auth_hash()</span></code></a>\nmethod, authenticated sessions will include the hash returned by this function.\nIn the <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser\" title=\"django.contrib.auth.models.AbstractBaseUser\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AbstractBaseUser</span></code></a> case, this is an\nHMAC of the password field. Django verifies that the hash in the session for\neach request matches the one that’s computed during the request. This allows a\nuser to log out all of their sessions by changing their password.</p>\n<p>The default password change views included with Django,\n<a class=\"reference internal\" href=\"#django.contrib.auth.views.PasswordChangeView\" title=\"django.contrib.auth.views.PasswordChangeView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordChangeView</span></code></a> and the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">user_change_password</span></code> view in the <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/#module-django.contrib.auth\" title=\"django.contrib.auth: Django's authentication framework.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code></a> admin, update\nthe session with the new password hash so that a user changing their own\npassword won’t log themselves out. If you have a custom password change view\nand wish to have similar behavior, use the <a class=\"reference internal\" href=\"#django.contrib.auth.update_session_auth_hash\" title=\"django.contrib.auth.update_session_auth_hash\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">update_session_auth_hash()</span></code></a>\nfunction.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.update_session_auth_hash\">\n<span class=\"sig-name descname\"><span class=\"pre\">update_session_auth_hash</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">user</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.update_session_auth_hash\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>This function takes the current request and the updated user object from\nwhich the new session hash will be derived and updates the session hash\nappropriately. It also rotates the session key so that a stolen session\ncookie will be invalidated.</p>\n<p>예시 용례:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">update_session_auth_hash</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">password_change</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">PasswordChangeForm</span><span class=\"p\">(</span><span class=\"n\">user</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"n\">update_session_auth_hash</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>Since\n<a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash\" title=\"django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_session_auth_hash()</span></code></a>\nis based on <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>, updating your site to use a new secret\nwill invalidate all existing sessions.</p>\n</aside>\n</section>\n</section>\n<section id=\"module-django.contrib.auth.views\">\n<span id=\"authentication-views\"></span><span id=\"built-in-auth-views\"></span><h3>인증 뷰<a class=\"heading-anchor\" href=\"#module-django.contrib.auth.views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django provides several views that you can use for handling login, logout, and\npassword management. These make use of the <a class=\"reference internal\" href=\"#built-in-auth-forms\"><span class=\"std std-ref\">stock auth forms</span></a> but you can pass in your own forms as well.</p>\n<p>Django provides no default template for the authentication views. You should\ncreate your own templates for the views you want to use. The template context\nis documented in each view, see <a class=\"reference internal\" href=\"#all-authentication-views\"><span class=\"std std-ref\">All authentication views</span></a>.</p>\n<section id=\"using-the-views\">\n<span id=\"id4\"></span><h4>Using the views<a class=\"heading-anchor\" href=\"#using-the-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>There are different methods to implement these views in your project. The\neasiest way is to include the provided URLconf in <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.urls</span></code>\nin your own URLconf, for example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;accounts/&#39;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s1\">&#39;django.contrib.auth.urls&#39;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>This will include the following URL patterns:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">login</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;login&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">logout</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;logout&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">password_change</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;password_change&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">password_change</span><span class=\"o\">/</span><span class=\"n\">done</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;password_change_done&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">password_reset</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;password_reset&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">password_reset</span><span class=\"o\">/</span><span class=\"n\">done</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;password_reset_done&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">reset</span><span class=\"o\">/&lt;</span><span class=\"n\">uidb64</span><span class=\"o\">&gt;/&lt;</span><span class=\"n\">token</span><span class=\"o\">&gt;/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;password_reset_confirm&#39;</span><span class=\"p\">]</span>\n<span class=\"n\">accounts</span><span class=\"o\">/</span><span class=\"n\">reset</span><span class=\"o\">/</span><span class=\"n\">done</span><span class=\"o\">/</span> <span class=\"p\">[</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;password_reset_complete&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>The views provide a URL name for easier reference. See <a class=\"reference internal\" href=\"/ko/3.1/topics/http/urls/\"><span class=\"doc\">the URL\ndocumentation</span></a> for details on using named URL patterns.</p>\n<p>If you want more control over your URLs, you can reference a specific view in\nyour URLconf:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">auth_views</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;change-password/&#39;</span><span class=\"p\">,</span> <span class=\"n\">auth_views</span><span class=\"o\">.</span><span class=\"n\">PasswordChangeView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>The views have optional arguments you can use to alter the behavior of the\nview. For example, if you want to change the template name a view uses, you can\nprovide the <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> argument. A way to do this is to provide keyword\narguments in the URLconf, these will be passed on to the view. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s1\">&#39;change-password/&#39;</span><span class=\"p\">,</span>\n        <span class=\"n\">auth_views</span><span class=\"o\">.</span><span class=\"n\">PasswordChangeView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;change-password.html&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>All views are <a class=\"reference internal\" href=\"/ko/3.1/topics/class-based-views/\"><span class=\"doc\">class-based</span></a>, which allows\nyou to easily customize them by subclassing.</p>\n</section>\n<section id=\"all-authentication-views\">\n<span id=\"id5\"></span><h4>All authentication views<a class=\"heading-anchor\" href=\"#all-authentication-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>This is a list with all the views <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code> provides. For\nimplementation details see <a class=\"reference internal\" href=\"#using-the-views\"><span class=\"std std-ref\">Using the views</span></a>.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LoginView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">login</span></code></p>\n<p>See <a class=\"reference internal\" href=\"/ko/3.1/topics/http/urls/\"><span class=\"doc\">the URL documentation</span></a> for details on using\nnamed URL patterns.</p>\n<p><strong>Attributes:</strong></p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The name of a template to display for the view used to\nlog the user in. Defaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/login.html</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code>: The name of a <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> field containing the\nURL to redirect to after login. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">authentication_form</span></code>: A callable (typically a form class) to use for\nauthentication. Defaults to\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.AuthenticationForm\" title=\"django.contrib.auth.forms.AuthenticationForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationForm</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_authenticated_user</span></code>: A boolean that controls whether or not\nauthenticated users accessing the login page will be redirected as if\nthey had just successfully logged in. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">경고</p>\n<p>If you enable <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_authenticated_user</span></code>, other websites will be\nable to determine if their visitors are authenticated on your site by\nrequesting redirect URLs to image files on your website. To avoid\nthis “<a class=\"reference external\" href=\"https://robinlinus.github.io/socialmedia-leak/\">social media fingerprinting</a>” information\nleakage, host all images and your favicon on a separate domain.</p>\n<p>Enabling <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_authenticated_user</span></code> can also result in a redirect\nloop when using the <a class=\"reference internal\" href=\"#django.contrib.auth.decorators.permission_required\" title=\"django.contrib.auth.decorators.permission_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">permission_required()</span></code></a> decorator\nunless the <code class=\"docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code> parameter is used.</p>\n</aside>\n</li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">success_url_allowed_hosts</span></code>: A <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#set\" title=\"(Python v3.14에서)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">set</span></code></a> of hosts, in addition to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a>, that are\nsafe for redirecting after login. Defaults to an empty <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#set\" title=\"(Python v3.14에서)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">set</span></code></a>.</p></li>\n</ul>\n<p>Here’s what <code class=\"docutils literal notranslate\"><span class=\"pre\">LoginView</span></code> does:</p>\n<ul class=\"simple\">\n<li><p>If called via <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>, it displays a login form that POSTs to the\nsame URL. More on this in a bit.</p></li>\n<li><p>If called via <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> with user submitted credentials, it tries to log\nthe user in. If login is successful, the view redirects to the URL\nspecified in <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>. If <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> isn’t provided, it redirects to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_REDIRECT_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_REDIRECT_URL</span></code></a> (which\ndefaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">/accounts/profile/</span></code>). If login isn’t successful, it\nredisplays the login form.</p></li>\n</ul>\n<p>It’s your responsibility to provide the html for the login template\n, called <code class=\"docutils literal notranslate\"><span class=\"pre\">registration/login.html</span></code> by default. This template gets passed\nfour template context variables:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code>: A <a class=\"reference internal\" href=\"/ko/3.1/ref/forms/api/#django.forms.Form\" title=\"django.forms.Form\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Form</span></code></a> object representing the\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.AuthenticationForm\" title=\"django.contrib.auth.forms.AuthenticationForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationForm</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>: The URL to redirect to after successful login. This may\ncontain a query string, too.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code>: The current <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>,\naccording to the <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting. If you don’t have the\nsite framework installed, this will be set to an instance of\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a>, which derives the\nsite name and domain from the current\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">site_name</span></code>: An alias for <code class=\"docutils literal notranslate\"><span class=\"pre\">site.name</span></code>. If you don’t have the site\nframework installed, this will be set to the value of\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.META\" title=\"django.http.HttpRequest.META\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.META['SERVER_NAME']</span></code></a>.\nFor more on sites, see <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/\"><span class=\"doc\">The “sites” framework</span></a>.</p></li>\n</ul>\n<p>If you’d prefer not to call the template <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/login.html</span></code>,\nyou can pass the <code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code> parameter via the extra arguments to\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">as_view</span></code> method in your URLconf. For example, this URLconf line would\nuse <code class=\"file docutils literal notranslate\"><span class=\"pre\">myapp/login.html</span></code> instead:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;accounts/login/&#39;</span><span class=\"p\">,</span> <span class=\"n\">auth_views</span><span class=\"o\">.</span><span class=\"n\">LoginView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">template_name</span><span class=\"o\">=</span><span class=\"s1\">&#39;myapp/login.html&#39;</span><span class=\"p\">)),</span>\n</code></pre></div>\n<p>You can also specify the name of the <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> field which contains the URL\nto redirect to after login using <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code>. By default, the\nfield is called <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>.</p>\n<p>Here’s a sample <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/login.html</span></code> template you can use as a\nstarting point. It assumes you have a <code class=\"file docutils literal notranslate\"><span class=\"pre\">base.html</span></code> template that\ndefines a <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> block:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">extends</span> <span class=\"s2\">&quot;base.html&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">block</span> <span class=\"nv\">content</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">form.errors</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Your username and password didn&#39;t match. Please try again.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">next</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">user.is_authenticated</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Your account doesn&#39;t have access to this page. To proceed,\n    please login with an account that has access.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Please login to see this page.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span> <span class=\"na\">action</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;login&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">csrf_token</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">table</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">tr</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.username.label_tag</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.username</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">tr</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">tr</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.password.label_tag</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">form.password</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">td</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">tr</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">table</span><span class=\"p\">&gt;</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;login&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;hidden&quot;</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;next&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">next</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n\n<span class=\"c\">{# Assumes you setup the password_reset view in your URLconf #}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;password_reset&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>Lost password?<span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">endblock</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>If you have customized authentication (see <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/\"><span class=\"doc\">Customizing Authentication</span></a>) you can use a custom authentication form by\nsetting the <code class=\"docutils literal notranslate\"><span class=\"pre\">authentication_form</span></code> attribute. This form must accept a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> keyword argument in its <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> method and provide a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_user()</span></code> method which returns the authenticated user object (this\nmethod is only ever called after successful form validation).</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LogoutView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LogoutView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LogoutView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Logs a user out.</p>\n<p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">logout</span></code></p>\n<p><strong>Attributes:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">next_page</span></code>: The URL to redirect to after logout. Defaults to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGOUT_REDIRECT_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGOUT_REDIRECT_URL</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to display after\nlogging the user out. Defaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/logged_out.html</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code>: The name of a <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> field containing the\nURL to redirect to after log out. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>. Overrides the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">next_page</span></code> URL if the given <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> parameter is passed.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">success_url_allowed_hosts</span></code>: A <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#set\" title=\"(Python v3.14에서)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">set</span></code></a> of hosts, in addition to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.get_host\" title=\"django.http.HttpRequest.get_host\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code></a>, that are\nsafe for redirecting after logout. Defaults to an empty <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#set\" title=\"(Python v3.14에서)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">set</span></code></a>.</p></li>\n</ul>\n<p><strong>Template context:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">title</span></code>: The string “Logged out”, localized.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code>: The current <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/#django.contrib.sites.models.Site\" title=\"django.contrib.sites.models.Site\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Site</span></code></a>,\naccording to the <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a> setting. If you don’t have the\nsite framework installed, this will be set to an instance of\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/#django.contrib.sites.requests.RequestSite\" title=\"django.contrib.sites.requests.RequestSite\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestSite</span></code></a>, which derives the\nsite name and domain from the current\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">site_name</span></code>: An alias for <code class=\"docutils literal notranslate\"><span class=\"pre\">site.name</span></code>. If you don’t have the site\nframework installed, this will be set to the value of\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.META\" title=\"django.http.HttpRequest.META\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.META['SERVER_NAME']</span></code></a>.\nFor more on sites, see <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/\"><span class=\"doc\">The “sites” framework</span></a>.</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.logout_then_login\">\n<span class=\"sig-name descname\"><span class=\"pre\">logout_then_login</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">login_url</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.logout_then_login\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Logs a user out, then redirects to the login page.</p>\n<p><strong>URL name:</strong> No default URL provided</p>\n<p><strong>Optional arguments:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code>: The URL of the login page to redirect to.\nDefaults to <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a> if not supplied.</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordChangeView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">password_change</span></code></p>\n<p>Allows a user to change their password.</p>\n<p><strong>Attributes:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to use for\ndisplaying the password change form. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_change_form.html</span></code> if not supplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">success_url</span></code>: The URL to redirect to after a successful password\nchange. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'password_change_done'</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code>: A custom “change password” form which must accept a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code> keyword argument. The form is responsible for actually changing\nthe user’s password. Defaults to\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.PasswordChangeForm\" title=\"django.contrib.auth.forms.PasswordChangeForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordChangeForm</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n</ul>\n<p><strong>Template context:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code>: The password change form (see <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> above).</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeDoneView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordChangeDoneView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeDoneView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">password_change_done</span></code></p>\n<p>The page shown after a user has changed their password.</p>\n<p><strong>Attributes:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to use.\nDefaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_change_done.html</span></code> if not\nsupplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordResetView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">password_reset</span></code></p>\n<p>Allows a user to reset their password by generating a one-time use link\nthat can be used to reset the password, and sending that link to the\nuser’s registered email address.</p>\n<p>If the email address provided does not exist in the system, this view\nwon’t send an email, but the user won’t receive any error message either.\nThis prevents information leaking to potential attackers. If you want to\nprovide an error message in this case, you can subclass\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.PasswordResetForm\" title=\"django.contrib.auth.forms.PasswordResetForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordResetForm</span></code></a> and use the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> attribute.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>Be aware that sending an email costs extra time, hence you may be\nvulnerable to an email address enumeration timing attack due to a\ndifference between the duration of a reset request for an existing\nemail address and the duration of a reset request for a nonexistent\nemail address. To reduce the overhead, you can use a 3rd party package\nthat allows to send emails asynchronously, e.g. <a class=\"reference external\" href=\"https://pypi.org/project/django-mailer/\">django-mailer</a>.</p>\n</aside>\n<p>Users flagged with an unusable password (see\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.set_unusable_password\" title=\"django.contrib.auth.models.User.set_unusable_password\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set_unusable_password()</span></code></a> aren’t\nallowed to request a password reset to prevent misuse when using an\nexternal authentication source like LDAP. Note that they won’t receive any\nerror message since this would expose their account’s existence but no\nmail will be sent either.</p>\n<p><strong>Attributes:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to use for\ndisplaying the password reset form. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_form.html</span></code> if not supplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code>: Form that will be used to get the email of\nthe user to reset the password for. Defaults to\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.PasswordResetForm\" title=\"django.contrib.auth.forms.PasswordResetForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordResetForm</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">email_template_name</span></code>: The full name of a template to use for\ngenerating the email with the reset password link. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_email.html</span></code> if not supplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">subject_template_name</span></code>: The full name of a template to use for\nthe subject of the email with the reset password link. Defaults\nto <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_subject.txt</span></code> if not supplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">token_generator</span></code>: Instance of the class to check the one time link.\nThis will default to <code class=\"docutils literal notranslate\"><span class=\"pre\">default_token_generator</span></code>, it’s an instance of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.tokens.PasswordResetTokenGenerator</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">success_url</span></code>: The URL to redirect to after a successful password reset\nrequest. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'password_reset_done'</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">from_email</span></code>: A valid email address. By default Django uses\nthe <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-DEFAULT_FROM_EMAIL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEFAULT_FROM_EMAIL</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">html_email_template_name</span></code>: The full name of a template to use\nfor generating a <em class=\"mimetype\">text/html</em> multipart email with the password\nreset link. By default, HTML email is not sent.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_email_context</span></code>: A dictionary of context data that will be\navailable in the email template. It can be used to override default\ntemplate context values listed below e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code>.</p></li>\n</ul>\n<p><strong>Template context:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code>: The form (see <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> above) for resetting the user’s\npassword.</p></li>\n</ul>\n<p><strong>Email template context:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">email</span></code>: An alias for <code class=\"docutils literal notranslate\"><span class=\"pre\">user.email</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code>: The current <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>,\naccording to the <code class=\"docutils literal notranslate\"><span class=\"pre\">email</span></code> form field. Only active users are able to\nreset their passwords (<code class=\"docutils literal notranslate\"><span class=\"pre\">User.is_active</span> <span class=\"pre\">is</span> <span class=\"pre\">True</span></code>).</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">site_name</span></code>: An alias for <code class=\"docutils literal notranslate\"><span class=\"pre\">site.name</span></code>. If you don’t have the site\nframework installed, this will be set to the value of\n<a class=\"reference internal\" href=\"/ko/3.1/ref/request-response/#django.http.HttpRequest.META\" title=\"django.http.HttpRequest.META\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.META['SERVER_NAME']</span></code></a>.\nFor more on sites, see <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/sites/\"><span class=\"doc\">The “sites” framework</span></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code>: An alias for <code class=\"docutils literal notranslate\"><span class=\"pre\">site.domain</span></code>. If you don’t have the site\nframework installed, this will be set to the value of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">request.get_host()</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">protocol</span></code>: http or https</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">uid</span></code>: The user’s primary key encoded in base 64.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">token</span></code>: Token to check that the reset link is valid.</p></li>\n</ul>\n<p>Sample <code class=\"docutils literal notranslate\"><span class=\"pre\">registration/password_reset_email.html</span></code> (email body template):</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Someone asked for password reset for email <span class=\"cp\">{{</span> <span class=\"nv\">email</span> <span class=\"cp\">}}</span>. Follow the link below:\n<span class=\"cp\">{{</span> <span class=\"nv\">protocol</span><span class=\"cp\">}}</span>://<span class=\"cp\">{{</span> <span class=\"nv\">domain</span> <span class=\"cp\">}}{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;password_reset_confirm&#39;</span> <span class=\"nv\">uidb64</span><span class=\"o\">=</span><span class=\"nv\">uid</span> <span class=\"nv\">token</span><span class=\"o\">=</span><span class=\"nv\">token</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>The same template context is used for subject template. Subject must be\nsingle line plain text string.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetDoneView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordResetDoneView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetDoneView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">password_reset_done</span></code></p>\n<p>The page shown after a user has been emailed a link to reset their\npassword. This view is called by default if the <a class=\"reference internal\" href=\"#django.contrib.auth.views.PasswordResetView\" title=\"django.contrib.auth.views.PasswordResetView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordResetView</span></code></a>\ndoesn’t have an explicit <code class=\"docutils literal notranslate\"><span class=\"pre\">success_url</span></code> URL set.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>If the email address provided does not exist in the system, the user is\ninactive, or has an unusable password, the user will still be\nredirected to this view but no email will be sent.</p>\n</aside>\n<p><strong>Attributes:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to use.\nDefaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_done.html</span></code> if not\nsupplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordResetConfirmView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">password_reset_confirm</span></code></p>\n<p>Presents a form for entering a new password.</p>\n<p><strong>Keyword arguments from the URL:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">uidb64</span></code>: The user’s id encoded in base 64.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">token</span></code>: Token to check that the password is valid.</p></li>\n</ul>\n<p><strong>Attributes:</strong></p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to display the confirm\npassword view. Default value is\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_confirm.html</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">token_generator</span></code>: Instance of the class to check the password. This\nwill default to <code class=\"docutils literal notranslate\"><span class=\"pre\">default_token_generator</span></code>, it’s an instance of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.tokens.PasswordResetTokenGenerator</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">post_reset_login</span></code>: A boolean indicating if the user should be\nautomatically authenticated after a successful password reset. Defaults\nto <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">post_reset_login_backend</span></code>: A dotted path to the authentication\nbackend to use when authenticating a user if <code class=\"docutils literal notranslate\"><span class=\"pre\">post_reset_login</span></code> is\n<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Required only if you have multiple\n<a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a> configured. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code>: Form that will be used to set the password. Defaults to\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.SetPasswordForm\" title=\"django.contrib.auth.forms.SetPasswordForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SetPasswordForm</span></code></a>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">success_url</span></code>: URL to redirect after the password reset done. Defaults\nto <code class=\"docutils literal notranslate\"><span class=\"pre\">'password_reset_complete'</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">reset_url_token</span></code>: Token parameter displayed as a component of password\nreset URLs. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'set-password'</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.0\">\n<p class=\"version-note-title\">Changed in Django 3.0</p><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_url_token</span></code> class attribute was added.</p>\n</aside>\n</li>\n</ul>\n<p><strong>Template context:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">form</span></code>: The form (see <code class=\"docutils literal notranslate\"><span class=\"pre\">form_class</span></code> above) for setting the new user’s\npassword.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">validlink</span></code>: Boolean, True if the link (combination of <code class=\"docutils literal notranslate\"><span class=\"pre\">uidb64</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">token</span></code>) is valid or unused yet.</p></li>\n</ul>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetCompleteView\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordResetCompleteView</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetCompleteView\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><strong>URL name:</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">password_reset_complete</span></code></p>\n<p>Presents a view which informs the user that the password has been\nsuccessfully changed.</p>\n<p><strong>Attributes:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">template_name</span></code>: The full name of a template to display the view.\nDefaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_complete.html</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">extra_context</span></code>: A dictionary of context data that will be added to the\ndefault context data passed to the template.</p></li>\n</ul>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"helper-functions\">\n<h3>Helper functions<a class=\"heading-anchor\" href=\"#helper-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.redirect_to_login\">\n<span class=\"sig-name descname\"><span class=\"pre\">redirect_to_login</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">next</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">login_url</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">redirect_field_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'next'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.redirect_to_login\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Redirects to the login page, and then back to another URL after a\nsuccessful login.</p>\n<p><strong>Required arguments:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>: The URL to redirect to after a successful login.</p></li>\n</ul>\n<p><strong>Optional arguments:</strong></p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code>: The URL of the login page to redirect to.\nDefaults to <a class=\"reference internal\" href=\"/ko/3.1/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a> if not supplied.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code>: The name of a <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> field containing the\nURL to redirect to after log out. Overrides <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> if the given\n<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> parameter is passed.</p></li>\n</ul>\n</dd></dl>\n\n</section>\n<section id=\"module-django.contrib.auth.forms\">\n<span id=\"built-in-forms\"></span><span id=\"built-in-auth-forms\"></span><h3>Built-in forms<a class=\"heading-anchor\" href=\"#module-django.contrib.auth.forms\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you don’t want to use the built-in views, but want the convenience of not\nhaving to write forms for this functionality, the authentication system\nprovides several built-in forms located in <a class=\"reference internal\" href=\"#module-django.contrib.auth.forms\" title=\"django.contrib.auth.forms\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.forms</span></code></a>:</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p>The built-in authentication forms make certain assumptions about the user\nmodel that they are working with. If you’re using a <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#auth-custom-user\"><span class=\"std std-ref\">custom user model</span></a>, it may be necessary to define your own forms for the\nauthentication system. For more information, refer to the documentation\nabout <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms\"><span class=\"std std-ref\">using the built-in authentication forms with custom user models</span></a>.</p>\n</aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.AdminPasswordChangeForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AdminPasswordChangeForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.AdminPasswordChangeForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A form used in the admin interface to change a user’s password.</p>\n<p>Takes the <code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code> as the first positional argument.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.AuthenticationForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AuthenticationForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.AuthenticationForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A form for logging a user in.</p>\n<p>Takes <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> as its first positional argument, which is stored on the\nform instance for use by sub-classes.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.AuthenticationForm.confirm_login_allowed\">\n<span class=\"sig-name descname\"><span class=\"pre\">confirm_login_allowed</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">user</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.AuthenticationForm.confirm_login_allowed\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>By default, <code class=\"docutils literal notranslate\"><span class=\"pre\">AuthenticationForm</span></code> rejects users whose <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code>\nflag is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>. You may override this behavior with a custom\npolicy to determine which users can log in. Do this with a custom form\nthat subclasses <code class=\"docutils literal notranslate\"><span class=\"pre\">AuthenticationForm</span></code> and overrides the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">confirm_login_allowed()</span></code> method. This method should raise a\n<a class=\"reference internal\" href=\"/ko/3.1/ref/exceptions/#django.core.exceptions.ValidationError\" title=\"django.core.exceptions.ValidationError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code></a> if the given user may\nnot log in.</p>\n<p>For example, to allow all users to log in regardless of “active”\nstatus:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AuthenticationForm</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AuthenticationFormWithInactiveUsersOkay</span><span class=\"p\">(</span><span class=\"n\">AuthenticationForm</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">confirm_login_allowed</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">user</span><span class=\"p\">):</span>\n        <span class=\"k\">pass</span>\n</code></pre></div>\n<p>(In this case, you’ll also need to use an authentication backend that\nallows inactive users, such as\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.backends.AllowAllUsersModelBackend\" title=\"django.contrib.auth.backends.AllowAllUsersModelBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AllowAllUsersModelBackend</span></code></a>.)</p>\n<p>Or to allow only some active users to log in:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">PickyAuthenticationForm</span><span class=\"p\">(</span><span class=\"n\">AuthenticationForm</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">confirm_login_allowed</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">user</span><span class=\"p\">):</span>\n        <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_active</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n                <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;This account is inactive.&quot;</span><span class=\"p\">),</span>\n                <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s1\">&#39;inactive&#39;</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">username</span><span class=\"o\">.</span><span class=\"n\">startswith</span><span class=\"p\">(</span><span class=\"s1\">&#39;b&#39;</span><span class=\"p\">):</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span>\n                <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;Sorry, accounts starting with &#39;b&#39; aren&#39;t welcome here.&quot;</span><span class=\"p\">),</span>\n                <span class=\"n\">code</span><span class=\"o\">=</span><span class=\"s1\">&#39;no_b_users&#39;</span><span class=\"p\">,</span>\n            <span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.PasswordChangeForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordChangeForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.PasswordChangeForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A form for allowing a user to change their password.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.PasswordResetForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PasswordResetForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.PasswordResetForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A form for generating and emailing a one-time use link to reset a\nuser’s password.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.PasswordResetForm.send_mail\">\n<span class=\"sig-name descname\"><span class=\"pre\">send_mail</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">subject_template_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">email_template_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">context</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">from_email</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">to_email</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">html_email_template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.PasswordResetForm.send_mail\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Uses the arguments to send an <code class=\"docutils literal notranslate\"><span class=\"pre\">EmailMultiAlternatives</span></code>.\nCan be overridden to customize how the email is sent to the user.</p>\n<dl class=\"field-list simple\">\n<dt class=\"field-odd\">매개변수<span class=\"colon\">:</span></dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>subject_template_name</strong> – the template for the subject.</p></li>\n<li><p><strong>email_template_name</strong> – the template for the email body.</p></li>\n<li><p><strong>context</strong> – context passed to the <code class=\"docutils literal notranslate\"><span class=\"pre\">subject_template</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">email_template</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">html_email_template</span></code> (if it is not\n<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>).</p></li>\n<li><p><strong>from_email</strong> – the sender’s email.</p></li>\n<li><p><strong>to_email</strong> – the email of the requester.</p></li>\n<li><p><strong>html_email_template_name</strong> – the template for the HTML body;\ndefaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, in which case a plain text email is sent.</p></li>\n</ul>\n</dd>\n</dl>\n<p>By default, <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> populates the <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> with the\nsame variables that\n<a class=\"reference internal\" href=\"#django.contrib.auth.views.PasswordResetView\" title=\"django.contrib.auth.views.PasswordResetView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PasswordResetView</span></code></a> passes to its\nemail context.</p>\n</dd></dl>\n\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.SetPasswordForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SetPasswordForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.SetPasswordForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A form that lets a user change their password without entering the old\npassword.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.UserChangeForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">UserChangeForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.UserChangeForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A form used in the admin interface to change a user’s information and\npermissions.</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.forms.UserCreationForm\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">UserCreationForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.UserCreationForm\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A <a class=\"reference internal\" href=\"/ko/3.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a> for creating a new user.</p>\n<p>It has three fields: <code class=\"docutils literal notranslate\"><span class=\"pre\">username</span></code> (from the user model), <code class=\"docutils literal notranslate\"><span class=\"pre\">password1</span></code>,\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">password2</span></code>. It verifies that <code class=\"docutils literal notranslate\"><span class=\"pre\">password1</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">password2</span></code> match,\nvalidates the password using\n<a class=\"reference internal\" href=\"/ko/3.1/topics/auth/passwords/#django.contrib.auth.password_validation.validate_password\" title=\"django.contrib.auth.password_validation.validate_password\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">validate_password()</span></code></a>, and\nsets the user’s password using\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.set_password\" title=\"django.contrib.auth.models.User.set_password\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">set_password()</span></code></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"authentication-data-in-templates\">\n<h3>Authentication data in templates<a class=\"heading-anchor\" href=\"#authentication-data-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The currently logged-in user and their permissions are made available in the\n<a class=\"reference internal\" href=\"/ko/3.1/ref/templates/api/\"><span class=\"doc\">template context</span></a> when you use\n<a class=\"reference internal\" href=\"/ko/3.1/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a>.</p>\n<aside class=\"admonition-technicality admonition\">\n<p class=\"admonition-title\">Technicality</p>\n<p>Technically, these variables are only made available in the template\ncontext if you use <a class=\"reference internal\" href=\"/ko/3.1/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a> and the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.auth.context_processors.auth'</span></code> context processor is\nenabled. It is in the default generated settings file. For more, see the\n<a class=\"reference internal\" href=\"/ko/3.1/ref/templates/api/#subclassing-context-requestcontext\"><span class=\"std std-ref\">RequestContext docs</span></a>.</p>\n</aside>\n<section id=\"users\">\n<h4>사용자<a class=\"heading-anchor\" href=\"#users\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When rendering a template <a class=\"reference internal\" href=\"/ko/3.1/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a>, the\ncurrently logged-in user, either a  <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User\" title=\"django.contrib.auth.models.User\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User</span></code></a>\ninstance or an <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.AnonymousUser\" title=\"django.contrib.auth.models.AnonymousUser\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AnonymousUser</span></code></a> instance, is\nstored in the template variable <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">user</span> <span class=\"pre\">}}</span></code>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">user.is_authenticated</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Welcome, <span class=\"cp\">{{</span> <span class=\"nv\">user.username</span> <span class=\"cp\">}}</span>. Thanks for logging in.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>Welcome, new user. Please log in.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>This template context variable is not available if a <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code> is not\nbeing used.</p>\n</section>\n<section id=\"permissions\">\n<h4>권한<a class=\"heading-anchor\" href=\"#permissions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The currently logged-in user’s permissions are stored in the template variable\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">perms</span> <span class=\"pre\">}}</span></code>. This is an instance of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.context_processors.PermWrapper</span></code>, which is a\ntemplate-friendly proxy of permissions.</p>\n<p>Evaluating a single-attribute lookup of <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">perms</span> <span class=\"pre\">}}</span></code> as a boolean is a proxy\nto <a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.has_module_perms\" title=\"django.contrib.auth.models.User.has_module_perms\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">User.has_module_perms()</span></code></a>. For example, to check if\nthe logged-in user has any permissions in the <code class=\"docutils literal notranslate\"><span class=\"pre\">foo</span></code> app:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">perms</span><span class=\"o\">.</span><span class=\"n\">foo</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Evaluating a two-level-attribute lookup as a boolean is a proxy to\n<a class=\"reference internal\" href=\"/ko/3.1/ref/contrib/auth/#django.contrib.auth.models.User.has_perm\" title=\"django.contrib.auth.models.User.has_perm\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">User.has_perm()</span></code></a>. For example,\nto check if the logged-in user has the permission <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.add_vote</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">{</span><span class=\"o\">%</span> <span class=\"k\">if</span> <span class=\"n\">perms</span><span class=\"o\">.</span><span class=\"n\">foo</span><span class=\"o\">.</span><span class=\"n\">add_vote</span> <span class=\"o\">%</span><span class=\"p\">}</span>\n</code></pre></div>\n<p>Here’s a more complete example of checking permissions in a template:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">perms.foo</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>You have permission to do something in the foo app.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">perms.foo.add_vote</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>You can vote!<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">perms.foo.add_driving</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>You can drive!<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>You don&#39;t have permission to do anything in the foo app.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>It is possible to also look permissions up by <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">if</span> <span class=\"pre\">in</span> <span class=\"pre\">%}</span></code> statements.\nFor example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"s1\">&#39;foo&#39;</span> <span class=\"k\">in</span> <span class=\"nv\">perms</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"s1\">&#39;foo.add_vote&#39;</span> <span class=\"k\">in</span> <span class=\"nv\">perms</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>In lookup works, too.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"managing-users-in-the-admin\">\n<span id=\"auth-admin\"></span><h2>Managing users in the admin<a class=\"heading-anchor\" href=\"#managing-users-in-the-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>When you have both <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth</span></code>\ninstalled, the admin provides a convenient way to view and manage users,\ngroups, and permissions. Users can be created and deleted like any Django\nmodel. Groups can be created, and permissions can be assigned to users or\ngroups. A log of user edits to models made within the admin is also stored and\ndisplayed.</p>\n<section id=\"id6\">\n<h3>사용자 생성하기<a class=\"heading-anchor\" href=\"#id6\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You should see a link to “Users” in the “Auth”\nsection of the main admin index page. The “Add user” admin page is different\nthan standard admin pages in that it requires you to choose a username and\npassword before allowing you to edit the rest of the user’s fields.</p>\n<p>Also note: if you want a user account to be able to create users using the\nDjango admin site, you’ll need to give them permission to add users <em>and</em>\nchange users (i.e., the “Add user” and “Change user” permissions). If an\naccount has permission to add users but not to change them, that account won’t\nbe able to add users. Why? Because if you have permission to add users, you\nhave the power to create superusers, which can then, in turn, change other\nusers. So Django requires add <em>and</em> change permissions as a slight security\nmeasure.</p>\n<p>Be thoughtful about how you allow users to manage permissions. If you give a\nnon-superuser the ability to edit users, this is ultimately the same as giving\nthem superuser status because they will be able to elevate permissions of\nusers including themselves!</p>\n</section>\n<section id=\"id7\">\n<h3>패스워드 변경하기<a class=\"heading-anchor\" href=\"#id7\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>User passwords are not displayed in the admin (nor stored in the database), but\nthe <a class=\"reference internal\" href=\"/ko/3.1/topics/auth/passwords/\"><span class=\"doc\">password storage details</span></a> are displayed.\nIncluded in the display of this information is a link to\na password change form that allows admins to change user passwords.</p>\n</section>\n</section>","rootId":"using-the-django-authentication-system","toc":[{"title":"사용자 객체","anchor":"user-objects","children":[{"title":"사용자 생성하기","anchor":"creating-users","children":[]},{"title":"Superusers 생성하기","anchor":"creating-superusers","children":[]},{"title":"패스워드 변경하기","anchor":"changing-passwords","children":[]},{"title":"사용자 인증하기","anchor":"authenticating-users","children":[]}]},{"title":"권한과 인증","anchor":"permissions-and-authorization","children":[{"title":"디폴트 권한","anchor":"default-permissions","children":[]},{"title":"그룹","anchor":"groups","children":[]},{"title":"프로그래밍적으로 권한 추가하기","anchor":"programmatically-creating-permissions","children":[]},{"title":"권한 캐싱","anchor":"permission-caching","children":[]},{"title":"대리 모델 (Proxy Model )","anchor":"proxy-models","children":[]}]},{"title":"웹 요청의 인증","anchor":"authentication-in-web-requests","children":[{"title":"사용자가 로그인 하는법","anchor":"how-to-log-a-user-in","children":[{"title":"Selecting the authentication backend","anchor":"selecting-the-authentication-backend","children":[]}]},{"title":"사용자가 로그아웃 하는법","anchor":"how-to-log-a-user-out","children":[]},{"title":"로그인한 사용자의 접근 제한하기","anchor":"limiting-access-to-logged-in-users","children":[{"title":"기본 방법","anchor":"the-raw-way","children":[]},{"title":"The login_required decorator","anchor":"the-login-required-decorator","children":[]},{"title":"The LoginRequired mixin","anchor":"the-loginrequired-mixin","children":[]},{"title":"Limiting access to logged-in users that pass a test","anchor":"limiting-access-to-logged-in-users-that-pass-a-test","children":[]},{"title":"The permission_required decorator","anchor":"the-permission-required-decorator","children":[]},{"title":"The PermissionRequiredMixin mixin","anchor":"the-permissionrequiredmixin-mixin","children":[]}]},{"title":"Redirecting unauthorized requests in class-based views","anchor":"redirecting-unauthorized-requests-in-class-based-views","children":[{"title":"패스워드 변경시 세션 무효화","anchor":"session-invalidation-on-password-change","children":[]}]},{"title":"인증 뷰","anchor":"module-django.contrib.auth.views","children":[{"title":"Using the views","anchor":"using-the-views","children":[]},{"title":"All authentication views","anchor":"all-authentication-views","children":[]}]},{"title":"Helper functions","anchor":"helper-functions","children":[]},{"title":"Built-in forms","anchor":"module-django.contrib.auth.forms","children":[]},{"title":"Authentication data in templates","anchor":"authentication-data-in-templates","children":[{"title":"사용자","anchor":"users","children":[]},{"title":"권한","anchor":"permissions","children":[]}]}]},{"title":"Managing users in the admin","anchor":"managing-users-in-the-admin","children":[{"title":"사용자 생성하기","anchor":"id6","children":[]},{"title":"패스워드 변경하기","anchor":"id7","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django 사용하기","url":"/ko/3.1/topics/"},{"docname":"topics/auth/index","title":"Django에서의 사용자 증명","url":"/ko/3.1/topics/auth/"}],"prev":{"docname":"topics/auth/index","title":"Django에서의 사용자 증명","url":"/ko/3.1/topics/auth/"},"next":{"docname":"topics/auth/passwords","title":"Password management in Django","url":"/ko/3.1/topics/auth/passwords/"},"formats":{"html":"/ko/3.1/topics/auth/default/","markdown":"/ko/3.1/topics/auth/default.md","json":"/ko/3.1/topics/auth/default.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/auth/default.txt","official":"https://docs.djangoproject.com/ko/3.1/topics/auth/default/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}