{"title":"“REMOTE_USER”를 이용해 인증하는 방법","version":"5.0","locale":"ko","docname":"howto/auth-remote-user","url":"/ko/5.0/howto/auth-remote-user/","canonical":"https://djangodocs.dev/ko/5.0/howto/auth-remote-user/","summary":"이 문서는 Django 애플리케이션에서 외부 인증 소스( REMOTE_USER 환경변수를 설정한 웹서버)를 사용하는 방법을 기술합니다. 이러한 인증 방법은 대개 인트라넷, IIS와 통합된 윈도우즈 인증 또는 Apache의 mod_authnz_ldap , CAS , WebAuth ,…","html":"<h1>“REMOTE_USER”를 이용해 인증하는 방법<a class=\"heading-anchor\" href=\"#how-to-authenticate-using-remote-user\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>이 문서는 Django 애플리케이션에서 외부 인증 소스(<code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> 환경변수를 설정한 웹서버)를 사용하는 방법을 기술합니다. 이러한 인증 방법은 대개 인트라넷, IIS와 통합된 윈도우즈 인증 또는 Apache의 <a class=\"reference external\" href=\"https://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html\">mod_authnz_ldap</a>, <a class=\"reference external\" href=\"https://www.apereo.org/projects/cas\">CAS</a>, <a class=\"reference external\" href=\"https://uit.stanford.edu/service/authentication\">WebAuth</a>, <a class=\"reference external\" href=\"https://sourceforge.net/projects/mod-auth-sspi\">mod_auth_sspi</a> 등과 같은 싱글 사인온 솔루션에서 볼 수 있습니다.</p>\n<p>웹 서버에서 인증을 관리할 때 대개 내부 어플리케이션을 사용하기 위해 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> 환경 변수를 설정합니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> 값은 <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> 혹은 <code class=\"docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code>에서 사용됩니다. <a class=\"reference internal\" href=\"/ko/5.0/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>에서 <a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a> 클래스를 찾을 수 있습니다.</p>\n<section id=\"configuration\">\n<h2>설정<a class=\"heading-anchor\" href=\"#configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>우선,  <a class=\"reference internal\" href=\"/ko/5.0/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.middleware.AuthenticationMiddleware</span></code></a>를 설정하기 전에 <a class=\"reference internal\" href=\"/ko/5.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>에 <a class=\"reference internal\" href=\"/ko/5.0/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\">django.contrib.auth.middleware.RemoteUserMiddleware</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=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.AuthenticationMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.RemoteUserMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>그 다음 , <a class=\"reference internal\" href=\"/ko/5.0/ref/settings/#std-setting-AUTHENTICATION_BACKENDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code></a> 세팅에 있는 <a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.backends.ModelBackend\" title=\"django.contrib.auth.backends.ModelBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code></a>를 <a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</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=\"n\">AUTHENTICATION_BACKENDS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.contrib.auth.backends.RemoteUserBackend&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>설정을 마치고 난 후, <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code>는 유저네임을 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META['REMOTE_USER']</span></code>에서 찾을 수 있을 것 입니다. 그리고 <a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a>를 이용하여 사용자를 증명하고 자동 로그인을 할 것입니다.</p>\n<p>이 설정은 인증을 기본 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>로 사용하지 못하게 합니다. 그 말은 만약 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code> 값이 설정되어 있지 않으면 Django의 관리 인터페이스를 사용한다 하더라도 사용자는 로그인할 수 없다는 것입니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.auth.backends.ModelBackend</span></code>를 <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code> 리스트에 추가하면 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>가 없을 경우``ModelBackend``로 대체하여 이 문제를 해결할 수 있습니다.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.admin</span></code>의 뷰와 <a class=\"reference internal\" href=\"/ko/5.0/ref/django-admin/#django-admin-createsuperuser\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createsuperuser</span></code></a> 관리 명령과 같은 Django의 사용자 관리는 원격 사용자와 통합할 수 없습니다. 이 인터페이스들은 <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTHENTICATION_BACKENDS</span></code>와 상관없이 데이터페이스에 저장된 사용자와만 작동합니다.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">참고</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code>는 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>를 상속하기 때문에 독자는 <code class=\"docutils literal notranslate\"><span class=\"pre\">ModelBackend</span></code>에서 구현된 권한 확인을 모두 그대로 가지고 있습니다.</p>\n<p>Users with <a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.models.User.is_active\" title=\"django.contrib.auth.models.User.is_active\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">is_active=False</span></code></a> won’t be allowed to\nauthenticate. Use\n<a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\" title=\"django.contrib.auth.backends.AllowAllUsersRemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AllowAllUsersRemoteUserBackend</span></code></a> if\nyou want to allow them to.</p>\n</aside>\n<p>만약에 여러분의 인증 메커니즘이 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>가 아닌 맞춤 HTTP 헤더를 사용한다면 독자는 <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code>를 서브클래스화할 수 있고 <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span></code> 속성을 요구되는 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</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.middleware</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RemoteUserMiddleware</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomHeaderMiddleware</span><span class=\"p\">(</span><span class=\"n\">RemoteUserMiddleware</span><span class=\"p\">):</span>\n    <span class=\"n\">header</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;HTTP_AUTHUSER&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">경고</p>\n<p>맞춤 HTTP 헤더로 <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code> 서브클래스를 사용한다면 매우 조심해야 합니다. 독자는 반드시 자신의 프론트엔드 웹서버가 최종 사용자가 가짜 헤더 값을 보내는 것을 허용하지 않도록 헤더를 적절한 인증 확인을 기반으로 설정하여야 합니다. HTTP 헤더 <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth-User</span></code>와 <code class=\"docutils literal notranslate\"><span class=\"pre\">X-Auth_User</span></code> (예를 들어) 모두 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code>에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_X_AUTH_USER</span></code> 키로 표준화되기 때문에 독자는 또한 본인의 웹 서버가 밑줄을 사용한 스푸핑된 헤더를 허용하지 않도록 확인하여야 합니다.</p>\n<p>이 경고는 <code class=\"docutils literal notranslate\"><span class=\"pre\">header</span> <span class=\"pre\">=</span> <span class=\"pre\">'REMOTE_USER'</span></code>인 기본 설정에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code>를 적용하지 않습니다. <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code>에서 <code class=\"docutils literal notranslate\"><span class=\"pre\">HTTP_</span></code>로 시작하지 않는 키는 HTTP 요청 헤더로부터 직접이 아닌 WSGI 서버를 통해서만 설정될 수 있기 때문입니다.</p>\n</aside>\n<p>만약 독자가 더 많은 제어를 필요로 할 경우, <a class=\"reference internal\" href=\"/ko/5.0/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend\" title=\"django.contrib.auth.backends.RemoteUserBackend\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserBackend</span></code></a>를 상속하는 인증 백엔드를 스스로 만들어 하나 이상의 속성과 메소드를 오버라이드할 수 있습니다.</p>\n</section>\n<section id=\"using-remote-user-on-login-pages-only\">\n<span id=\"persistent-remote-user-middleware-howto\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>는 로그인 페이지에서만 사용할 수 있습니다.<a class=\"heading-anchor\" href=\"#using-remote-user-on-login-pages-only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>인증 미들웨어인 <code class=\"docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code>는 HTTP 요청 헤더인 <code class=\"docutils literal notranslate\"><span class=\"pre\">REMOTE_USER</span></code>가 모든 인증된 요청과 함께 존재한다는 것을 가정합니다. 이것은 Basic HTTP Auth가 <code class=\"docutils literal notranslate\"><span class=\"pre\">htpasswd</span></code> 또는 기타 간단한 메커니즘들과 함께일 때 기대거나 실용적이지만,  Negotiate(GSSAPI / Kerberos) 또는 기타 자원 집약적인 인증 방법과 함께 일 때는, 프런트엔드 HTTP 서버에서의 인증은 일반적으로 하나 또는 몇 개의 로그인 URL을 설정해야하고, 인증이 성공하면 응용 프로그램은 인증된 세션 자체가 유지 관리된다라는 조건이여야합니다.</p>\n<p><a class=\"reference internal\" href=\"/ko/5.0/ref/middleware/#django.contrib.auth.middleware.PersistentRemoteUserMiddleware\" title=\"django.contrib.auth.middleware.PersistentRemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></code></a>는 사용 사례에 대한 지원을 제공합니다. 이것은 사용자에 의하여 명시적으로 로그아웃할 때까지 인증된 세션을 유지 관리할 것 입니다. 이 클래스는 위의 문서에서 <a class=\"reference internal\" href=\"/ko/5.0/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> 일시 대체품으로 사용되어질 수 있습니다.</p>\n</section>","rootId":"how-to-authenticate-using-remote-user","toc":[{"title":"설정","anchor":"configuration","children":[]},{"title":"REMOTE_USER는 로그인 페이지에서만 사용할 수 있습니다.","anchor":"using-remote-user-on-login-pages-only","children":[]}],"breadcrumbs":[{"docname":"howto/index","title":"“How-to” 가이드","url":"/ko/5.0/howto/"}],"prev":{"docname":"howto/index","title":"“How-to” 가이드","url":"/ko/5.0/howto/"},"next":{"docname":"howto/csrf","title":"장고의 CSRF 보호를 사용하는 방법","url":"/ko/5.0/howto/csrf/"},"formats":{"html":"/ko/5.0/howto/auth-remote-user/","markdown":"/ko/5.0/howto/auth-remote-user.md","json":"/ko/5.0/howto/auth-remote-user.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/howto/auth-remote-user.txt","official":"https://docs.djangoproject.com/ko/5.0/howto/auth-remote-user/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}