2010년 6월 7일 월요일

08. 로그인 과정

django의 로그인 처리는 django의 Model-Template-View 기반 처리를 그대로 따릅니다.

Model 은 앞선 models.Users 객체를 사용하며

Template의 경우는 프로젝트의 settings.py 에 정의된 TEMPLATE_DIRS 아래에 Template으로 사용할 html 문서를 사용하는 것 외에 사용자 로그인을 위한 TEMPLATE_DIRS/registration/login.html 을 작성한 것을 로그인 페이지로 사용합니다.

 

로그인 과정중 사용하는 사용자의 요청(결국은 시스템이 만들어내는) 은 다음과 같은 요청들이 존재합니다.

  • ^accounts/login
  • ^accounts/logout
  • ^accounts/profile

 

그리고 요청에 따른 로그인 처리등을 핸들링하는 몇가지 정해진 view 들이 존재합니다.

 

이런 기본 지식을 가지고 실제 사용하는 예를 살펴보도록 합시다.

 

1. 로그인 URL 추가 - urls.py

  1. urlpatterns = patterns('',
  2.     ...
  3.     (r'^accounts/login/$', 'django.contrib.auth.views.login'),
  4.    ...)

 - 추후에 설명하겠지만 위와 같이 urls.py를 작성하면 "http://본인의 서버명/accounts/login"으로 요청하면 django의 login view로 연결합니다.

 

2. login form의 작성

위에 사용한 로그인 뷰는 TEMPLATE_DIRS/registration/login.html을 템플릿으로 사용하며 개발자가 개발하는 시스템에 맞도록 구축하여 사용합니다. 예를 위해 다음과 같이 작성합도록 합시다.

  1. <html>

  2. <head>

  3. <title>로그인 form</title>

  4. </head>

  5. <body>

  6. {% if form.erros %}

  7. <p>로그인 과정중 오류가 발생하였습니다.</p>

  8. <p>ID와 암호를 확인해 주세요</p>

  9. {% endif %}

  10. <h2>사용자 로그인</h2>

  11. <form method="POST" action=".">

  12. <!-- form.username : ID를 위한 <INPUT TYPE="text" /> 삽입 //-->

  13. <p><label for="userID">사용자 ID</label> {{ form.username }}</p>

  14. <!-- form.password : 암호를 위한 <INPUT TYPE="password" /> 삽입 //-->

  15. <p><label for="userPWD">사용자 암호</label> {{ form.password }}</p>

  16. <input type="submit" value="로그인" />

  17. </form>

  18. </body>

  19. </html>

 

위의 코드를 개발 서버에서 요청하면 다음과 같은 결과를 보여줍니다. (http://127.0.0.1:8000/accounts/login/)

 cap01.JPG

 

이 상태에서 바로 사용자 ID와 사용자 암호를 넣고 로그인 버튼을 누르면 다음과 같은 에러를 만날수 있는데 이는 django에서 크로스 사이트 스크립팅(cross-site scripting) 공격에 대해 무방비임을 알리는 에러메세지입니다.

 

cap01(1).JPG 

 

이같은 상황이 발생할 경우 <form> 태그 옆에 아래와 같이 django의 csrf 토큰을 추가하는 것으로 방지할 수 있습니다.(이에 대해서는 추후 설명하도록 하겠다)

 

  1.  <form method="POST" action=".">{% csrf_token %}

 

이제 비어있는 사용자 ID 혹은 틀린 암호를 넣고 로그인하여 보면 다음과 같은 에러가 나오는데 이는 위에서 {% if form.errors %}에 의해 나타나는 것임을 알 수 있습니다.

 

cap01(2).JPG 

 

정상적으로 로그인 하였다면 아직은 로그인 이후 이동할 곳을 작성하지 않아 에러가 나옵니다.

 

3. 로그인 이후 이동할 페이지

이제 로그인 이후 기본적으로는 ^accounts/profile/$로 이동을 하나 form에 next이름을 갖는 숨김 폼필드(<INPUT TYPE="HIDDEN" NAME="next">)를 작성하여 이동할 페이지를 정할 수 있습니다.

예제에서는 첫 페이지로 이동하도록 하겠습니다.

 

<FORM> 안에 다음과 같은 요소를 삽입합니다.

 

  1. <INPUT TYPE="HIDDEN" NAME="next" VALUE="/" />

 

위의 코드는 로그인이 정상적으로 이뤄지면 첫 페이지로 이동하라는 의미입니다.

 

이상으로부터 최종 수정된 login.html은 다음과 같습니다.

 

  1. <html>
  2. <head>

  3.    <title> 로그인 form</title>
  4. </head>
  5. <body>
  6. {% if form.errors %}
  7. <p>로그인 과정중 오류가 발생하였습니다.</p>
  8. <p>ID 와 암호를 확인해 주세요</p>
  9. {% endif %}
  10. <h2>사용자 로그인</h2>
  11. <form method="POST" action=".">{% csrf_token %}
  12.    <!-- form.username : ID를 위한 <INPUT TYPE="text" /> 삽입 //-->
  13.    <p><label for="userID">사용자 ID</label> {{ form.username }}</p>
  14.    <!-- # form.password : 암호를 위한 <INPUT TYPE="password" /> 삽입 //-->
  15.    <p><label for="userPWD">사용자 암호</label> {{ form.password }}</p>
  16.    <INPUT TYPE="HIDDEN" NAME="next" VALUE="/" />
  17.    <INPUT TYPE="submit" VALUE="로그인" />
  18. </form>
  19. </body>
  20. </html>

 

 

 

간략히 로그인 과정에 대해 살펴보았습니다. 이를 요약하면

  기본적인 로그인 화면 구성을 위해

  • 로그인 url 생성
  • 로그인 Form 작성
  • 로그인 후 이동할 페이지 지정

 

으로 볼 수 있습니다.

 

본 예제를 위해 수정한 파일은 urls.py과 TEMPLATE_DIRS/registration/login.html 입니다.

이 글은 스프링노트에서 작성되었습니다.

댓글 없음:

댓글 쓰기