{"title":"Django 인증 시스템을 사용","version":"6.1","locale":"ko","docname":"topics/auth/default","url":"/ko/6.1/topics/auth/default/","canonical":"https://djangodocs.dev/ko/6.1/topics/auth/default/","summary":"이 문서는 기본 설정 상태에서의 Django 인증 시스템 사용법을 설명합니다. 이 설정은 가장 일반적인 프로젝트의 요구 사항을 충족하기 위해 발전해 왔으며, 상당히 넓은 범위의 작업을 처리할 수 있고 비밀번호 및 권한 관리도 매우 정교하게 구현되어 있습니다. 인증 요구 사항이 기본 설정과 다른…","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>이 문서는 기본 설정 상태에서의 Django 인증 시스템 사용법을 설명합니다. 이 설정은 가장 일반적인 프로젝트의 요구 사항을 충족하기 위해 발전해 왔으며, 상당히 넓은 범위의 작업을 처리할 수 있고 비밀번호 및 권한 관리도 매우 정교하게 구현되어 있습니다. 인증 요구 사항이 기본 설정과 다른 프로젝트의 경우, Django는 인증 시스템의 광범위한 :doc:` 확장 및 커스터마이징 을 지원합니다.</p>\n<p>Django 인증 시스템은 인증과 권한 부여 기능을 함께 제공하며, 이 두 기능이 서로 어느 정도 결합되어 있기 때문에 일반적으로는 이를 통칭하여 인증 시스템이라고 부릅니다.</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/6.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> 객체는 Django 인증 시스템의 핵심입니다. 이들은 일반적으로 사이트와 상호작용하는 사람을 나타내며, 접근 제한, 사용자 프로필 등록, 콘텐츠와 작성자 연결 등의 기능을 활성화하는 데 사용됩니다. Django 인증 프레임워크에는 단 한 종류의 사용자 클래스만 존재합니다. 즉, :attr:’superusers’ 슈퍼유저의&lt;django.contrib.auth.models.User.is_superuser&gt; 또는 관리용 :attr:’staff’ &lt;django.contrib.auth.models.User.is_staff&gt; 스태프 사용자는 별도의 사용자 클래스가 아니라, 특정 속성이 설정된 일반 사용자 객체일 뿐입니다.</p>\n<p>디폴트 사용자의 주요 속성은 :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ko/6.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/6.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/6.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/6.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/6.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/6.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> API documentation for a\ncomplete 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>The most direct way to create users is to use the included\n<a class=\"reference internal\" href=\"/ko/6.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> helper function:</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\">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=\"s2\">&quot;john&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;lennon@thebeatles.com&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;johnpassword&quot;</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=\"s2\">&quot;Lennon&quot;</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>Create superusers using the <a class=\"reference internal\" href=\"/ko/6.1/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a> command:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>createsuperuser<span class=\"w\"> </span>--username<span class=\"o\">=</span>joe<span class=\"w\"> </span>--email<span class=\"o\">=</span>joe@example.com\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py createsuperuser --username=joe --email=joe@example.com\n</code></pre></div></div></div>\n<p>당신은 프롬프트를 통해 패스워드 입력을  해야할 것 입니다. 패스워드를 입력한 뒤, 사용자가 바로 생성될 것입니다. 만약 <a class=\"reference internal\" href=\"/ko/6.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/6.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/6.1/topics/auth/passwords/\"><span class=\"doc\">비밀번호 조작하기 문서</span></a> ). 이로 인해, 사용자의 패스워드 속성을 직접적으로 조작하려 시도하지 마십시오. 이는 사용자 생성을 위해 헬퍼 함수를 사용하는 이유입니다.</p>\n<p>사용자의 패스워드를 변경하기 위해, 여러 옵션이 있습니다.</p>\n<p><a class=\"reference internal\" href=\"/ko/6.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/6.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=\"s2\">&quot;john&quot;</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=\"s2\">&quot;new password&quot;</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></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.aauthenticate\">\n<span class=\"sig-name descname\"><span class=\"pre\">aauthenticate</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.aauthenticate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>Asynchronous version</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aauthenticate()</span></code></p>\n<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/6.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/6.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/6.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\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=\"s2\">&quot;john&quot;</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"s2\">&quot;secret&quot;</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=\"o\">...</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"c1\"># No backend authenticated the credentials</span>\n    <span class=\"o\">...</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/6.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/6.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에는 권한 시스템이 내장되어 있다. 해당 권한 시스템은 특정 사용자 및 사용자 그룹에 권한을 할당하는 방법을 제공한다.</p>\n<p>그것은 Django 관리자 사이트에 사용 되지만 당신만의 소스코드에 사용할 수도 있다.</p>\n<p>Django 관리자 사이트는 권한을 다음과 같이 사용한다:</p>\n<ul class=\"simple\">\n<li><p>객체 보기에 대한 액세스 권한은 해당 객체 유형에 대한 “보기” 또는 “변경” 권한이 있는 사용자로 제한된다.</p></li>\n<li><p>“추가” 양식을 보고 객체를 추가할 수 있는 액세스 권한은 해당 객체 유형에 대한 “추가” 권한이 있는 사용자로 제한된다.</p></li>\n<li><p>변경 목록 보기, “변경” 양식 보기 및 객체 변경에 대한 액세스 권한은 해당 객체 유형에 대한 “변경” 권한이 있는 사용자로 제한된다.</p></li>\n<li><p>객체를 삭제할 수 있는 액세스 권한은 해당 객체 유형에 대해 “삭제” 권한이 있는 사용자로 제한된다.</p></li>\n</ul>\n<p>권한은 객체 유형별로 설정할 수 있을 뿐만 아니라 특정 객체 인스턴스별로도 설정할 수 있다.\n<a class=\"reference internal\" href=\"/ko/6.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> 클래스별 <a class=\"reference internal\" href=\"/ko/6.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>, <a class=\"reference internal\" href=\"/ko/6.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>, <a class=\"reference internal\" href=\"/ko/6.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>, <a class=\"reference internal\" href=\"/ko/6.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>  method를 사용하여 동일한 유형의 다른 객체 인스턴스에 대한 권한을 커스터마이즈 할 수 있다.</p>\n<p><a class=\"reference internal\" href=\"/ko/6.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> 객체에는 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>groups``와 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>user_permissions``라는 두 개의 다대다 필드가 있다. <a class=\"reference internal\" href=\"/ko/6.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> 객체는 다른 <a class=\"reference internal\" href=\"/ko/6.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><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django.contrib.auth``가 <a class=\"reference internal\" href=\"/ko/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> 설정에 나열되면 설치된 애플리케이션 중 하나에 정의된 각 Django 모델에 대해 네 가지 기본 권한인 추가, 변경, 삭제 및 보기가 생성되도록 한다.</p>\n<p>이 권한은 다음을 실행할 때 생성된다. <a class=\"reference internal\" href=\"/ko/6.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>; <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS`에</span> <span class=\"pre\">``django.contrib.auth``를</span> <span class=\"pre\">추가한</span> <span class=\"pre\">후</span> <span class=\"pre\">``migrate``를</span> <span class=\"pre\">처음</span> <span class=\"pre\">실행할</span> <span class=\"pre\">때,</span> <span class=\"pre\">기본</span> <span class=\"pre\">권한은</span> <span class=\"pre\">이전에</span> <span class=\"pre\">설치된</span> <span class=\"pre\">모든</span> <span class=\"pre\">모델과</span> <span class=\"pre\">해당</span> <span class=\"pre\">시점에</span> <span class=\"pre\">설치되는</span> <span class=\"pre\">모든</span> <span class=\"pre\">새</span> <span class=\"pre\">모델에</span> <span class=\"pre\">대해</span> <span class=\"pre\">생성된다.</span> <span class=\"pre\">이후</span> <span class=\"pre\">:djadmin:`manage.py</span> <span class=\"pre\">migrate</span> <span class=\"pre\">&lt;migrate&gt;`를</span> <span class=\"pre\">실행할</span> <span class=\"pre\">때마다</span> <span class=\"pre\">새</span> <span class=\"pre\">모델에</span> <span class=\"pre\">대한</span> <span class=\"pre\">기본</span> <span class=\"pre\">권한을</span> <span class=\"pre\">생성한다.</span> <span class=\"pre\">(권한을</span> <span class=\"pre\">생성하는</span> <span class=\"pre\">함수는</span> <span class=\"pre\">:data:`~django.db.models.signals.post_migrate</span></code> 신호에 연결됨). .</p>\n<p>When a model is renamed in an installed application, Django automatically\nupdates the associated default permissions to match the new model name when\nyou run <a class=\"reference internal\" href=\"/ko/6.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>.</p>\n<p>If a permission with the new codename already exists\n(for example, due to a leftover permission from a previous migration),\nDjango raises an error with next steps.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>Updating permissions when models are renamed was added.</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/ko/6.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> 와 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>Bar``라는 모델이 있는 애플리케이션이 있다고 가정하고 기본 권한을 테스트하려면 다음을 사용해야 한다:</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><a class=\"reference internal\" href=\"/ko/6.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> 모델은 직접 액세스하는 경우가 거의 없다.</p>\n<p>The <a class=\"reference internal\" href=\"/ko/6.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 provides a helper\nproperty, <a class=\"reference internal\" href=\"/ko/6.1/ref/contrib/auth/#django.contrib.auth.models.Permission.user_perm_str\" title=\"django.contrib.auth.models.Permission.user_perm_str\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">user_perm_str</span></code></a>,\nthat returns the string representation that can be used to check permission\nusing the <a class=\"reference internal\" href=\"/ko/6.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.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">user_perm_str</span></code> property was added.</p>\n</aside>\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/6.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> 모델은 사용자를 분류하는 일반적인 방법이므로 해당 사용자에게 권한이나 다른 레이블을 적용할 수 있다. 사용자는 여러 그룹에 속할 수 있다.</p>\n<p>그룹의 사용자는 자동으로 해당 그룹에 부여된 권한을 갖는다. 예를 들어 <code class=\"docutils literal notranslate\"><span class=\"pre\">Site</span> <span class=\"pre\">editors</span></code> 그룹에 <code class=\"docutils literal notranslate\"><span class=\"pre\">can_edit_home_page</span></code> 권한이 있는 경우 해당 그룹의 모든 사용자는 해당 권한을 갖게 됩니다.</p>\n<p>권한 외에도 그룹은 사용자를 분류하여 레이블이나 확장된 기능을 제공하는 편리한 방법이다. 예를 들어 <code class=\"docutils literal notranslate\"><span class=\"pre\">'Special</span> <span class=\"pre\">users'</span></code> 그룹을 만들고 사이트의 회원 전용 부분에 대한 액세스 권한을 부여하거나 회원 전용 이메일 메시지를 보내는 코드를 작성할 수 있다.</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><span class=\"xref std std-ref\">custom permissions &lt;custom-permissions&gt;`은 모델의 ``Meta`</span> 클래스 내에서 정의할 수 있지만 권한을 직접 생성할 수도 있다. 예를 들어 <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp</span></code>::에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">BlogPost</span></code> 모델에 대한 <code class=\"docutils literal notranslate\"><span class=\"pre\">can_publish</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=\"s2\">&quot;can_publish&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;Can Publish Posts&quot;</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>그런 다음 <code class=\"docutils literal notranslate\"><span class=\"pre\">user_permissions</span></code> 속성을 통해 권한을 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">User`에</span> <span class=\"pre\">할당하거나</span> <span class=\"pre\">또는</span> <span class=\"pre\">``permissions`</span></code> 속성을 통해 :class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.models.Group`에 할당할 수 있다.</p>\n<aside class=\"admonition-proxy-models-need-their-own-content-type admonition\">\n<p class=\"admonition-title\">프록시 모델은 자체 컨텐츠 유형이 필요합니다</p>\n<p><span class=\"xref std std-ref\">permissions for a proxy model &lt;proxy-models-permissions-topic&gt;`을 생성하려면 ``for_concrete_model=False``를 :meth:</span>.ContentTypeManager.get_for_model`에 전달하여 적절한 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>ContentType`::<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</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\">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>\n    <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>\n<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>:class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.backends.ModelBackend`는 권한 확인을 위해 가져와야 하는 처음 사용자 객체에 대한 권한을 캐시한다. 권한은 일반적으로 추가된 직후 확인되지 않기 때문에 일반적으로 요청-응답 주기에 적합하다(예: 관리자에서). 예를 들어 테스트나 보기에서 권한을 추가하고 즉시 확인하는 경우 가장 쉬운 솔루션은 데이터베이스에서 사용자를 다시 가져오는 것이다. 예를 들어:</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\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=\"s2\">&quot;myapp.change_blogpost&quot;</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=\"s2\">&quot;change_blogpost&quot;</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=\"s2\">&quot;myapp.change_blogpost&quot;</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=\"s2\">&quot;myapp.change_blogpost&quot;</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>프록시 모델은 실제 모델과 정확히 같은 방식으로 작동한다. 권한은 프록시 모델의 자체 콘텐츠 유형을 사용하여 생성된다. 프록시 모델은 하위 클래스로 분류되는 실제 모델의 권한을 상속하지 않는다.</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=\"s2\">&quot;can_eat_pizzas&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can eat pizzas&quot;</span><span class=\"p\">)]</span>\n\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=\"s2\">&quot;can_deliver_pizzas&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Can deliver pizzas&quot;</span><span class=\"p\">)]</span>\n</code></pre></div>\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=\"c1\"># Fetch the content type for the proxy model.</span>\n<span class=\"gp\">&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=\"gp\">&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=\"gp\">&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=\"go\">[&#39;add_student&#39;, &#39;change_student&#39;, &#39;delete_student&#39;, &#39;view_student&#39;,</span>\n<span class=\"go\">&#39;can_deliver_pizzas&#39;]</span>\n<span class=\"gp\">&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=\"gp\">... </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=\"gp\">...</span>\n<span class=\"gp\">&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=\"s2\">&quot;app.add_person&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&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=\"s2\">&quot;app.can_eat_pizzas&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&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=\"s2\">&quot;app.add_student&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;app.can_deliver_pizzas&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">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/6.1/topics/http/sessions/\"><span class=\"doc\">sessions</span></a> and middleware to hook the\nauthentication system into <a class=\"reference internal\" href=\"/ko/6.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> objects.</p>\n<p>These provide a <a class=\"reference internal\" href=\"/ko/6.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\nand a <a class=\"reference internal\" href=\"/ko/6.1/ref/request-response/#django.http.HttpRequest.auser\" title=\"django.http.HttpRequest.auser\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">request.auser</span></code></a> async method\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/6.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/6.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>그것들을 다음과 같이 :attr:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.models.User.is_authenticated`로 구분할 수 있다.</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<p>Or in an asynchronous view:</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\">user</span> <span class=\"o\">=</span> <span class=\"k\">await</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">auser</span><span class=\"p\">()</span>\n<span class=\"k\">if</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>현재 세션에 연결하려는 인증된 사용자가 있는 경우 - 이것은 <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<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></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.alogin\">\n<span class=\"sig-name descname\"><span class=\"pre\">alogin</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.alogin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>Asynchronous version</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">alogin()</span></code></p>\n<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/6.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/6.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>익명 세션 동안 설정된 모든 데이터는 사용자가 로그인한 후에도 세션에 유지된다.</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\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=\"s2\">&quot;username&quot;</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=\"s2\">&quot;password&quot;</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>인증 백엔드 선택<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>사용자가 로그인하면 사용자의 세션에 사용자의 ID와 인증에 사용된 백엔드가 저장된다. 이렇게 하면 동일한 :ref:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>authentication backend &lt;authentication-backends&gt;`가 향후 요청에서 사용자의 세부 정보를 가져올 수 있다. 세션에 저장할 인증 백엔드는 다음과 같이 선택된다.</p>\n<ol class=\"arabic simple\">\n<li><p>제공되는 경우 선택적 <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> 인수 값을 사용한다.</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>하나뿐인 경우 :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>AUTHENTICATION_BACKENDS`에 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>backend``를 사용한다</p></li>\n<li><p>그렇지 않으면 예외를 발생시킨다.</p></li>\n</ol>\n<p>사례 1과 2의 경우 <code class=\"docutils literal notranslate\"><span class=\"pre\">backend</span></code> 인수 또는 <code class=\"docutils literal notranslate\"><span class=\"pre\">user.backend</span></code> 속성의 값은 실제 백엔드 클래스가 아니라 점으로 구분된 import 경로 문자열(예: :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>AUTHENTICATION_BACKENDS`에 있음)이어야 한다.</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></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.alogout\">\n<span class=\"sig-name descname\"><span class=\"pre\">alogout</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.alogout\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>Asynchronous version</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">alogout()</span></code></p>\n<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/6.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\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>페이지에 대한 액세스를 제한하는 기본적인 방법은 :attr:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>request.user.is_authenticated &lt;django.contrib.auth.models.User.is_authenticated&gt;`를 확인하고 로그인 페이지로 리디렉션하는 것이다.</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\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=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">LOGIN_URL</span><span class=\"si\">}</span><span class=\"s2\">?next=</span><span class=\"si\">{</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"si\">}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\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.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\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=\"s2\">&quot;myapp/login_error.html&quot;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> 데코레이터<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>바로 가기로 편리한 <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\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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>:func:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.decorators.login_required`는 다음을 수행한다.</p>\n<ul class=\"simple\">\n<li><p>사용자가 로그인하지 않은 경우 쿼리 문자열에 현재 절대 경로를 전달하여 <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL&lt;LOGIN_URL&gt;</span> <span class=\"pre\">`로</span> <span class=\"pre\">리디렉션한다.</span> <span class=\"pre\">예:</span> <span class=\"pre\">`</span></code>/accounts/login/?next=/polls/3/<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>.</p></li>\n<li><p>사용자가 로그인되어 있으면 정상적으로 뷰를 실행한다. 뷰 코드는 사용자가 로그인했다고 가정할 수 있다.</p></li>\n</ul>\n<p>기본적으로 인증 성공 시 사용자가 리디렉션되어야 하는 경로는 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;next&quot;``라는</span> <span class=\"pre\">쿼리</span> <span class=\"pre\">문자열</span> <span class=\"pre\">매개변수에</span> <span class=\"pre\">저장된다.</span> <span class=\"pre\">이</span> <span class=\"pre\">매개변수에</span> <span class=\"pre\">다른</span> <span class=\"pre\">이름을</span> <span class=\"pre\">사용하고</span> <span class=\"pre\">싶다면</span> <span class=\"pre\">:func:`~django.contrib.auth.decorators.login_required`는</span> <span class=\"pre\">선택적</span> <span class=\"pre\">``redirect_field_name</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\">login_required</span>\n\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=\"s2\">&quot;my_redirect_field&quot;</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name``에</span> <span class=\"pre\">값을</span> <span class=\"pre\">제공하면</span> <span class=\"pre\">리디렉션</span> <span class=\"pre\">경로를</span> <span class=\"pre\">저장하는</span> <span class=\"pre\">템플릿</span> <span class=\"pre\">컨텍스트</span> <span class=\"pre\">변수가</span> <span class=\"pre\">``&quot;next&quot;</span></code> (기본값) 이 아닌 <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code> 값을 키로 사용하기 때문에 로그인 템플릿도 커스터마이즈해야 할 가능성이 크다.</p>\n<p><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required`는</span> <span class=\"pre\">선택적</span> <span class=\"pre\">``login_url`()</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\">login_required</span>\n\n\n<span class=\"nd\">@login_required</span><span class=\"p\">(</span><span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s2\">&quot;/accounts/login/&quot;</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code> 매개변수를 지정하지 않으면 :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>settings.LOGIN_URL &lt;LOGIN_URL&gt;`과 로그인 보기가 제대로 연결되어 있는지 확인해야 합니다. 예를 들어 기본값을 사용하여 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=\"s2\">&quot;accounts/login/&quot;</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>:setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>settings.LOGIN_URL &lt;LOGIN_URL&gt;`은 뷰 함수 이름과 :ref:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>named URL patterns &lt;naming-url-patterns&gt;`도 허용한다. 이렇게 하면 설정을 업데이트하지 않고도 URLconf 내에서 로그인 뷰를 자유롭게 다시 매핑할 수 있다.</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> decorator는 사용자의 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> 플래그를 확인하지 않지만 기본 :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>AUTHENTICATION_BACKENDS`는 비활성 사용자를 거부한다.</p>\n</aside>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">더 보기</p>\n<p>Django의 관리자를 위한 커스텀 뷰를 작성하는 경우(또는 내장된 뷰에서 사용하는 것과 동일한 권한 부여 확인이 필요한 경우) <a class=\"reference internal\" href=\"/ko/6.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> decorator가 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>login_required()``의 유용한 대안임을 찾을 수 있다.</p>\n</aside>\n</section>\n<section id=\"the-loginrequiredmixin-mixin\">\n<h4>The <code class=\"docutils literal notranslate\"><span class=\"pre\">LoginRequiredMixin</span></code> mixin<a class=\"heading-anchor\" href=\"#the-loginrequiredmixin-mixin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>:doc:class-based views &lt;/topics/class-based-views/index&gt;`를 사용할 때 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>LoginRequiredMixin``을 사용하여 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>login_required``와 동일한 동작을 얻을 수 있다. 이 믹스인은 상속 목록에서 가장 왼쪽에 있어야 한다.</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>뷰가 이 믹스인을 사용하는 경우 인증되지 않은 사용자의 모든 요청은 로그인 페이지로 리디렉션되거나 <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> 매개변수에 따라 HTTP 403 Forbidden 오류가 표시된다.</p>\n<p>:class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.mixins.AccessMixin`의 매개변수를 설정하여 권한이 없는 사용자 처리를 커스터마이즈할 수 있다.</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\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=\"s2\">&quot;/login/&quot;</span>\n    <span class=\"n\">redirect_field_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;redirect_to&quot;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">login_required</span></code> 데코레이터와 마찬가지로 이 믹스인은 사용자의 <code class=\"docutils literal notranslate\"><span class=\"pre\">is_active</span></code> 플래그를 확인하지 않지만 기본 :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>AUTHENTICATION_BACKENDS`는 비활성 사용자를 거부한다.</p>\n</aside>\n</section>\n<section id=\"the-login-not-required-decorator\">\n<span id=\"disable-login-required-middleware-for-views\"></span><h4>The <code class=\"docutils literal notranslate\"><span class=\"pre\">login_not_required</span></code> decorator<a class=\"heading-anchor\" href=\"#the-login-not-required-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When <a class=\"reference internal\" href=\"/ko/6.1/ref/middleware/#django.contrib.auth.middleware.LoginRequiredMiddleware\" title=\"django.contrib.auth.middleware.LoginRequiredMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LoginRequiredMiddleware</span></code></a> is\ninstalled, all views require authentication by default. Some views, such as the\nlogin view, may need to disable this behavior.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.decorators.login_not_required\">\n<span class=\"sig-name descname\"><span class=\"pre\">login_not_required</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.decorators.login_not_required\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Allows unauthenticated requests to this view when\n<a class=\"reference internal\" href=\"/ko/6.1/ref/middleware/#django.contrib.auth.middleware.LoginRequiredMiddleware\" title=\"django.contrib.auth.middleware.LoginRequiredMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LoginRequiredMiddleware</span></code></a> is\ninstalled.</p>\n</dd></dl>\n\n</section>\n<section id=\"limiting-access-to-logged-in-users-that-pass-a-test\">\n<h4>테스트를 통과한 로그인 사용자에 대한 액세스 제한<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>특정 권한이나 다른 테스트를 기반으로 액세스를 제한하려면 기본적으로 이전 섹션에서 설명한 것과 동일한 작업을 수행한다.</p>\n<p>뷰에서 직접 :attr:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>request.user &lt;django.http.HttpRequest.user&gt;`에 대한 테스트를 실행할 수 있다. 예를 들어, 이 뷰는 사용자가 원하는 도메인에 이메일이 있는지 확인하고 그렇지 않은 경우 로그인 페이지로 리디렉션한다.</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\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=\"s2\">&quot;@example.com&quot;</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">redirect</span><span class=\"p\">(</span><span class=\"s2\">&quot;/login/?next=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</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>단축키로 콜러블이 <code class=\"docutils literal notranslate\"><span class=\"pre\">False``를</span> <span class=\"pre\">반환할</span> <span class=\"pre\">때</span> <span class=\"pre\">리디렉션을</span> <span class=\"pre\">수행하는</span> <span class=\"pre\">편리한</span> <span class=\"pre\">``user_passes_test</span></code> 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\">user_passes_test</span>\n\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=\"s2\">&quot;@example.com&quot;</span><span class=\"p\">)</span>\n\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> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">User()</span></code> 객체를 취하고 사용자가 페이지를 볼 수 있는 경우 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>True``를 반환하는 콜러블. :func:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>~django.contrib.auth.decorators.user_passes_test`는 자동으로 :class:<a href=\"#id5\"><span class=\"problematic\" id=\"id6\">`</span></a>~django.contrib.auth.models.User`가 익명이 아닌지 확인하지 않는다는 점에 유의해야 한다.</p>\n<p>:func:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.decorators.user_passes_test`는 두 개의 선택적 인수를 사용한다.</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code></dt><dd><p>테스트를 통과하지 못한 사용자가 리디렉션될 URL을 지정할 수 있다. 로그인 페이지일 수 있으며 지정하지 않으면 기본값은 :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>settings.LOGIN_URL &lt;LOGIN_URL&gt;`이다.</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code></dt><dd><p>:func:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.decorators.login_required`와 동일하다. <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>None``으로 설정하면 URL에서 제거된다. 테스트를 통과하지 못한 사용자를 “다음 페이지”가 없는 비로그인 페이지로 리디렉션하는 경우 이 작업을 수행할 수 있다.</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=\"s2\">&quot;/login/&quot;</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> <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>:doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>class-based views &lt;/topics/class-based-views/index&gt;`를 사용하는 경우 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>UserPassesTestMixin``을 사용하여 이를 수행할 수 있다.</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>수행되는 테스트를 제공하려면 클래스의 <code class=\"docutils literal notranslate\"><span class=\"pre\">test_func()</span></code> 메서드를 재정의해야 한다. 또한 :class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.mixins.AccessMixin`의 매개변수를 설정하여 권한이 없는 사용자 처리를 커스터마이즈할 수 있다.</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\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    <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=\"s2\">&quot;@example.com&quot;</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>또한 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_test_func()</span></code> 메소드를 재정의하여 mixin이 검사를 위해 (<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\"><code class=\"docutils literal notranslate\"><span class=\"pre\">UserPassesTestMixin</span></code> 스태킹(Stacking)</p>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>UserPassesTestMixin``이 구현되는 방식으로 인해 상속 목록에 쌓을 수 없다. 다음은 작동하지 않는다:</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=\"s2\">&quot;@example.com&quot;</span><span class=\"p\">)</span>\n\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=\"s2\">&quot;django&quot;</span><span class=\"p\">)</span>\n\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> <span class=\"o\">...</span>\n</code></pre></div>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>TestMixin1``이 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>super()``를 호출하고 해당 결과를 고려하면 <a href=\"#id5\"><span class=\"problematic\" id=\"id6\">``</span></a>TestMixin1``은 더 이상 독립 실행형으로 작동하지 않는다.</p>\n</aside>\n</dd></dl>\n\n</section>\n<section id=\"the-permission-required-decorator\">\n<h4><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\n<span class=\"nd\">@permission_required</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls.add_choice&quot;</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ko/6.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> 메서드와 마찬가지로 권한 이름은 <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> 형식을 취한다(즉, <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> 애플리케이션의 모델에 대한 권한의 경우 <code class=\"docutils literal notranslate\"><span class=\"pre\">polls.add_choice</span></code>).</p>\n<p>decorator는 반복 가능한 권한을 가질 수도 있습니다. 이 경우 사용자는 뷰에 액세스하기 위해 모든 권한을 가지고 있어야 한다.</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\n<span class=\"nd\">@permission_required</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls.add_choice&quot;</span><span class=\"p\">,</span> <span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s2\">&quot;/loginpage/&quot;</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> <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> 데코레이터에서와 같이 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>login_url``의 기본값은 :setting:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>settings.LOGIN_URL &lt;LOGIN_URL&gt;`이다.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code> 매개변수가 지정되면 데코레이터는 로그인 페이지로 리디렉션하는 대신 :exc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.core.exceptions.PermissionDenied`를 발생시켜 :ref:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>403(HTTP Forbidden) view&lt;http_forbidden_view&gt;’를 표시한다.</p>\n<p><a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>raise_exception``을 사용하고 사용자에게 먼저 로그인할 기회를 주고 싶다면 <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> 데코레이터를 추가할 수 있다:</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\n<span class=\"nd\">@login_required</span>\n<span class=\"nd\">@permission_required</span><span class=\"p\">(</span><span class=\"s2\">&quot;polls.add_choice&quot;</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>이는 또한 :class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>.LoginView`의 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>redirect_authenticated_user=True``이고 로그인한 사용자에게 필요한 모든 권한이 없는 경우 리디렉션 루프를 방지한다.</p>\n</dd></dl>\n\n</section>\n<section id=\"the-permissionrequiredmixin-mixin\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">PermissionRequiredMixin</span></code> 믹스인<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>:doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>class-based views`에 권한 검사를 적용하려면 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>PermissionRequiredMixin``을 사용할 수 있다.</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>이 믹스인은 <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</span></code> decorator와 마찬가지로 뷰에 액세스하는 사용자에게 주어진 권한이 모두 있는지 여부를 확인하다. <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</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.mixins</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">PermissionRequiredMixin</span>\n\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=\"s2\">&quot;polls.add_choice&quot;</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=\"s2\">&quot;polls.view_choice&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;polls.change_choice&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>:class:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>~django.contrib.auth.mixins.AccessMixin`의 매개변수 중 하나를 설정하여 권한이 없는 사용자의 처리를 커스터마이즈할 수 있다.</p>\n<p>다음 메서드를 재정의할 수도 있다.</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>믹스인에서 사용하는 권한 이름의 이터러블을 반환한다. 기본값은 <code class=\"docutils literal notranslate\"><span class=\"pre\">permission_required</span></code> 속성으로, 필요한 경우 튜플로 변환된다.</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/6.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>클래스 기반 뷰에서 승인되지 않은 요청 리디렉션<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>:doc:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>class-based views &lt;/ref/class-based-views/index&gt;`에서 액세스 제한을 쉽게 처리하기 위해 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>AccessMixin``을 사용하여 액세스가 거부될 때 보기의 동작을 구성할 수 있다. 인증된 사용자는 HTTP 403 Forbidden 응답으로 액세스가 거부된다. 익명 사용자는 :attr:<a href=\"#id5\"><span class=\"problematic\" id=\"id6\">`</span></a>~django.contrib.auth.mixins.AccessMixin.raise_exception 속성에 따라 로그인 페이지로 리디렉션되거나 HTTP 403 Forbidden 응답이 표시된다.</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/6.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>:meth:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>get_permission_denied_message`의 기본 반환 값이다. 기본값은 빈 문자열이다.</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><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_redirect_field_name`의</span> <span class=\"pre\">기본</span> <span class=\"pre\">반환</span> <span class=\"pre\">값이다.</span> <span class=\"pre\">기본값은</span> <span class=\"pre\">`()</span></code>”next”<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>이다.</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/6.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>테스트를 통과하지 못한 사용자가 리디렉션될 URL을 반환한다. 설정되면 :attr:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>login_url`을 반환하고 그렇지 않으면 :setting:<a href=\"#id3\"><span class=\"problematic\" id=\"id4\">`</span></a>settings.LOGIN_URL &lt;LOGIN_URL&gt;`을 반환한다.</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><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">raise_exception`이</span> <span class=\"pre\">``True``인</span> <span class=\"pre\">경우</span> <span class=\"pre\">이</span> <span class=\"pre\">메서드를</span> <span class=\"pre\">사용하여</span> <span class=\"pre\">사용자에게</span> <span class=\"pre\">표시하기</span> <span class=\"pre\">위해</span> <span class=\"pre\">오류</span> <span class=\"pre\">처리기에</span> <span class=\"pre\">전달되는</span> <span class=\"pre\">오류</span> <span class=\"pre\">메시지를</span> <span class=\"pre\">제어할</span> <span class=\"pre\">수</span> <span class=\"pre\">있다.</span> <span class=\"pre\">기본적으로</span> <span class=\"pre\">:attr:`permission_denied_message</span></code> 속성을 반환한다.</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>로그인 성공 후 사용자가 리디렉션되어야 하는 URL을 포함할 쿼리 매개변수의 이름을 반환한다. 이것을 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>None``으로 설정하면 쿼리 매개변수가 추가되지 않는다. 기본적으로 <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> 속성을 반환한다.</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><code class=\"docutils literal notranslate\"><span class=\"pre\">raise_exception</span></code> 값에 따라, 이 메소드는 <a class=\"reference internal\" href=\"/ko/6.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> 예외를 발생시키거나 사용자를 <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>login_url``로 리디렉션하며, 설정되어 있는 경우 선택적으로 <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>redirect_field_name``을 포함한다.</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/6.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/6.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/6.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/6.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>Django, <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> 에 포함된 기본 비밀번호 변경 보기 및 <a class=\"reference internal\" href=\"/ko/6.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> 관리자의 <code class=\"docutils literal notranslate\"><span class=\"pre\">user_change_password</span></code> 보기는 새 비밀번호 해시로 세션을 업데이트하여 자신의 비밀번호를 변경한 사용자는 로그아웃되지 않는다. 사용자 정의 비밀번호 변경 보기가 있고 유사한 동작을 원하면 <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> 기능을 사용하시오.</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></dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.aupdate_session_auth_hash\">\n<span class=\"sig-name descname\"><span class=\"pre\">aupdate_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.aupdate_session_auth_hash\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><em>Asynchronous version</em>: <code class=\"docutils literal notranslate\"><span class=\"pre\">aupdate_session_auth_hash()</span></code></p>\n<p>이 함수는 현재 요청과 새 세션 해시가 파생될 업데이트된 사용자 객체를 가져오고 세션 해시를 적절하게 업데이트한다. 또한 도난당한 세션 쿠키가 무효화되도록 세션 키를 교체한다.</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\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=\"s2\">&quot;POST&quot;</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/6.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/6.1/ref/settings/#std-setting-SECRET_KEY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY</span></code></a>, secret key values must be\nrotated to avoid invalidating existing sessions when updating your site to\nuse a new secret. See <a class=\"reference internal\" href=\"/ko/6.1/ref/settings/#std-setting-SECRET_KEY_FALLBACKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECRET_KEY_FALLBACKS</span></code></a> for details.</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=\"s2\">&quot;accounts/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django.contrib.auth.urls&quot;</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=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>accounts/login/ [name=&#39;login&#39;]\naccounts/logout/ [name=&#39;logout&#39;]\naccounts/password_change/ [name=&#39;password_change&#39;]\naccounts/password_change/done/ [name=&#39;password_change_done&#39;]\naccounts/password_reset/ [name=&#39;password_reset&#39;]\naccounts/password_reset/done/ [name=&#39;password_reset_done&#39;]\naccounts/reset/&lt;uidb64&gt;/&lt;token&gt;/ [name=&#39;password_reset_confirm&#39;]\naccounts/reset/done/ [name=&#39;password_reset_complete&#39;]\n</code></pre></div>\n<p>The views provide a URL name for easier reference. See <a class=\"reference internal\" href=\"/ko/6.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=\"s2\">&quot;change-password/&quot;</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=\"s2\">&quot;change-password/&quot;</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=\"s2\">&quot;change-password.html&quot;</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/6.1/topics/class-based-views/\"><span class=\"doc\">class-based</span></a>, which\nallows you 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/6.1/topics/http/urls/\"><span class=\"doc\">the URL documentation</span></a> for details on using\nnamed URL patterns.</p>\n<p><strong>Methods and Attributes</strong></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The name of a template to display for the view used to log the user in.\nDefaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/login.html</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.next_page\">\n<span class=\"sig-name descname\"><span class=\"pre\">next_page</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.next_page\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The URL to redirect to after login. Defaults to\n<a class=\"reference internal\" href=\"/ko/6.1/ref/settings/#std-setting-LOGIN_REDIRECT_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGIN_REDIRECT_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.views.LoginView.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.views.LoginView.redirect_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The name of a <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> field containing the URL to redirect to after\nlogin. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code>. Overrides the\n<a class=\"reference internal\" href=\"#django.contrib.auth.views.LoginView.get_default_redirect_url\" title=\"django.contrib.auth.views.LoginView.get_default_redirect_url\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_default_redirect_url()</span></code></a> URL if the given <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> parameter is\npassed.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.authentication_form\">\n<span class=\"sig-name descname\"><span class=\"pre\">authentication_form</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.authentication_form\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A callable (typically a form class) to use for authentication. Defaults\nto <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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.redirect_authenticated_user\">\n<span class=\"sig-name descname\"><span class=\"pre\">redirect_authenticated_user</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.redirect_authenticated_user\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A boolean that controls whether or not authenticated users accessing\nthe login page will be redirected as if they had just successfully\nlogged 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\nbe able to determine if their visitors are authenticated on your\nsite by requesting redirect URLs to image files on your website. To\navoid this “<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\nredirect loop 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</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.success_url_allowed_hosts\">\n<span class=\"sig-name descname\"><span class=\"pre\">success_url_allowed_hosts</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.success_url_allowed_hosts\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>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 <a class=\"reference internal\" href=\"/ko/6.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 safe for redirecting\nafter 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>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LoginView.get_default_redirect_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_default_redirect_url</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LoginView.get_default_redirect_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returns the URL to redirect to after login. The default implementation\nresolves and returns <a class=\"reference internal\" href=\"#django.contrib.auth.views.LoginView.next_page\" title=\"django.contrib.auth.views.LoginView.next_page\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">next_page</span></code></a> if set, or\n<a class=\"reference internal\" href=\"/ko/6.1/ref/settings/#std-setting-LOGIN_REDIRECT_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGIN_REDIRECT_URL</span></code></a> otherwise.</p>\n</dd></dl>\n\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/6.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/6.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/6.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/6.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/6.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/6.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/6.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/6.1/ref/contrib/sites/\"><span class=\"doc\">“sites” 프레임워크</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 the\n<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=\"s2\">&quot;accounts/login/&quot;</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=\"s2\">&quot;myapp/login.html&quot;</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 set up 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/6.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 on <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> requests.</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<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LogoutView.next_page\">\n<span class=\"sig-name descname\"><span class=\"pre\">next_page</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LogoutView.next_page\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The URL to redirect to after logout. Defaults to\n<a class=\"reference internal\" href=\"/ko/6.1/ref/settings/#std-setting-LOGOUT_REDIRECT_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOGOUT_REDIRECT_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.views.LogoutView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LogoutView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to display after logging the user out.\nDefaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/logged_out.html</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LogoutView.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.views.LogoutView.redirect_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The name of a <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> field containing the URL to redirect to after log\nout. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'next'</span></code>. Overrides the\n<a class=\"reference internal\" href=\"#django.contrib.auth.views.LogoutView.next_page\" title=\"django.contrib.auth.views.LogoutView.next_page\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">next_page</span></code></a> URL if the given <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> parameter is\npassed.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LogoutView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LogoutView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.LogoutView.success_url_allowed_hosts\">\n<span class=\"sig-name descname\"><span class=\"pre\">success_url_allowed_hosts</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.LogoutView.success_url_allowed_hosts\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>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 <a class=\"reference internal\" href=\"/ko/6.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 safe for redirecting\nafter 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>\n</dd></dl>\n\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/6.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/6.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/6.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/6.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/6.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/6.1/ref/contrib/sites/\"><span class=\"doc\">“sites” 프레임워크</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 on <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> requests, 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/6.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<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use for displaying the password change\nform. Defaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_change_form.html</span></code> if not\nsupplied.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeView.success_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">success_url</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeView.success_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The URL to redirect to after a successful password change. Defaults to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'password_change_done'</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeView.form_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">form_class</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeView.form_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A custom “change password” form which must accept a <code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code> keyword\nargument. The form is responsible for actually changing the user’s\npassword. 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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</p>\n</dd></dl>\n\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<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeDoneView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeDoneView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_change_done.html</span></code> if not supplied.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordChangeDoneView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordChangeDoneView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</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.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>This view will send an email if the following conditions are met:</p>\n<ul class=\"simple\">\n<li><p>The email address provided exists in the system.</p></li>\n<li><p>The requested user is active (<code class=\"docutils literal notranslate\"><span class=\"pre\">User.is_active</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>).</p></li>\n<li><p>The requested user has a usable password. Users flagged with an unusable\npassword (see\n<a class=\"reference internal\" href=\"/ko/6.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.</p></li>\n</ul>\n<p>If any of these conditions are <em>not</em> met, no email will be sent, but the\nuser won’t receive any error message either. This prevents information\nleaking to potential attackers. If you want to provide an error message in\nthis 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=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-mailer/\">django-mailer</a>.</p>\n</aside>\n<p><strong>Attributes:</strong></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use for displaying the password reset\nform. Defaults to <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_form.html</span></code> if not\nsupplied.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.form_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">form_class</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.form_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Form that will be used to get the email of the user to reset the\npassword 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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.email_template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">email_template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.email_template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use for generating the email with the\nreset 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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.subject_template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">subject_template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.subject_template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use for the subject of the email with\nthe reset password link. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_subject.txt</span></code> if not supplied.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.token_generator\">\n<span class=\"sig-name descname\"><span class=\"pre\">token_generator</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.token_generator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Instance of the class to check the one time link. This will default to\n<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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.success_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">success_url</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.success_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The URL to redirect to after a successful password reset request.\nDefaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'password_reset_done'</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.from_email\">\n<span class=\"sig-name descname\"><span class=\"pre\">from_email</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.from_email\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A valid email address. By default Django uses the\n<a class=\"reference internal\" href=\"/ko/6.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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.html_email_template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">html_email_template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.html_email_template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use for generating a\n<em class=\"mimetype\">text/html</em> multipart email with the password reset link. By\ndefault, HTML email is not sent.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetView.extra_email_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_email_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetView.extra_email_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be available in the email\ntemplate. It can be used to override default template context values\nlisted below e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code>.</p>\n</dd></dl>\n\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/6.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/6.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/6.1/ref/contrib/sites/\"><span class=\"doc\">“sites” 프레임워크</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<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetDoneView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetDoneView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to use. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_done.html</span></code> if not supplied.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetDoneView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetDoneView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</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.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<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to display the confirm password view.\nDefault value is <code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_confirm.html</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.token_generator\">\n<span class=\"sig-name descname\"><span class=\"pre\">token_generator</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.token_generator\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Instance of the class to check the password. This will default to\n<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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.post_reset_login\">\n<span class=\"sig-name descname\"><span class=\"pre\">post_reset_login</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.post_reset_login\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A boolean indicating if the user should be automatically authenticated\nafter a successful password reset. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.post_reset_login_backend\">\n<span class=\"sig-name descname\"><span class=\"pre\">post_reset_login_backend</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.post_reset_login_backend\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dotted path to the authentication backend to use when authenticating\na user if <code class=\"docutils literal notranslate\"><span class=\"pre\">post_reset_login</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Required only if you have\nmultiple <a class=\"reference internal\" href=\"/ko/6.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\n<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.form_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">form_class</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.form_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>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>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.success_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">success_url</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.success_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>URL to redirect after the password reset done. Defaults to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'password_reset_complete'</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetConfirmView.reset_url_token\">\n<span class=\"sig-name descname\"><span class=\"pre\">reset_url_token</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetConfirmView.reset_url_token\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Token parameter displayed as a component of password reset URLs.\nDefaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">'set-password'</span></code>.</p>\n</dd></dl>\n\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<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetCompleteView.template_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">template_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetCompleteView.template_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>The full name of a template to display the view. Defaults to\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">registration/password_reset_complete.html</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.views.PasswordResetCompleteView.extra_context\">\n<span class=\"sig-name descname\"><span class=\"pre\">extra_context</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.views.PasswordResetCompleteView.extra_context\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A dictionary of context data that will be added to the default context\ndata passed to the template.</p>\n</dd></dl>\n\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/6.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 login. 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/6.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/6.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, including\nthe ability to set an unusable password (via\n<a class=\"reference internal\" href=\"/ko/6.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>), which\nblocks the user from logging in with password-based authentication.</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.AdminUserCreationForm\">\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\">AdminUserCreationForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.AdminUserCreationForm\"><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 create a new user. Inherits from\n<a class=\"reference internal\" href=\"#django.contrib.auth.forms.UserCreationForm\" title=\"django.contrib.auth.forms.UserCreationForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UserCreationForm</span></code></a>.</p>\n<p>It includes an additional <code class=\"docutils literal notranslate\"><span class=\"pre\">usable_password</span></code> field, enabled by default. If\n<code class=\"docutils literal notranslate\"><span class=\"pre\">usable_password</span></code> is enabled, it verifies that <code class=\"docutils literal notranslate\"><span class=\"pre\">password1</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">password2</span></code> are non empty and match, validates the password using\n<a class=\"reference internal\" href=\"/ko/6.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/6.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>.\nIf <code class=\"docutils literal notranslate\"><span class=\"pre\">usable_password</span></code> is disabled, no password validation is done, and\npassword-based authentication is disabled for the user by calling\n<a class=\"reference internal\" href=\"/ko/6.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>.</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/6.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\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/6.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=\"s2\">&quot;inactive&quot;</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=\"s2\">&quot;b&quot;</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=\"s2\">&quot;no_b_users&quot;</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.BaseUserCreationForm\">\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\">BaseUserCreationForm</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.forms.BaseUserCreationForm\"><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/6.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. This is the\nrecommended base class if you need to customize the user creation form.</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/6.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/6.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<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. If\nyou choose to override this method, be mindful of handling potential\nexceptions raised due to email sending failures.</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>Inherits from <a class=\"reference internal\" href=\"#django.contrib.auth.forms.BaseUserCreationForm\" title=\"django.contrib.auth.forms.BaseUserCreationForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BaseUserCreationForm</span></code></a>. To help prevent confusion with\nsimilar usernames, the form doesn’t allow usernames that differ only in\ncase.</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/6.1/ref/templates/api/\"><span class=\"doc\">template context</span></a> when you use\n<a class=\"reference internal\" href=\"/ko/6.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/6.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/6.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/6.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/6.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/6.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/6.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=\"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</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/6.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\nexample, to 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=\"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.add_vote</span> <span class=\"cp\">%}</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.\nAlternatively, on this page, you can choose a username and disable\npassword-based authentication for the user.</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/6.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 or unset 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":"인증 백엔드 선택","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":"login_required 데코레이터","anchor":"the-login-required-decorator","children":[]},{"title":"The LoginRequiredMixin mixin","anchor":"the-loginrequiredmixin-mixin","children":[]},{"title":"The login_not_required decorator","anchor":"the-login-not-required-decorator","children":[]},{"title":"테스트를 통과한 로그인 사용자에 대한 액세스 제한","anchor":"limiting-access-to-logged-in-users-that-pass-a-test","children":[]},{"title":"permission_required decorator","anchor":"the-permission-required-decorator","children":[]},{"title":"PermissionRequiredMixin 믹스인","anchor":"the-permissionrequiredmixin-mixin","children":[]}]},{"title":"클래스 기반 뷰에서 승인되지 않은 요청 리디렉션","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/6.1/topics/"},{"docname":"topics/auth/index","title":"Django에서의 사용자 증명","url":"/ko/6.1/topics/auth/"}],"prev":{"docname":"topics/auth/index","title":"Django에서의 사용자 증명","url":"/ko/6.1/topics/auth/"},"next":{"docname":"topics/auth/passwords","title":"Password management in Django","url":"/ko/6.1/topics/auth/passwords/"},"formats":{"html":"/ko/6.1/topics/auth/default/","markdown":"/ko/6.1/topics/auth/default.md","json":"/ko/6.1/topics/auth/default.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/auth/default.txt","official":"https://docs.djangoproject.com/ko/6.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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}