본문 바로가기

WebDev

django login 정리

django login 정리


django에서의 로그인이 어떻게 흘러가나 소스코드 다 까보고 정리해봤다.

django 1.9버전, 기본 로그인 처리를 기준으로 작성했다.




필수 요소


로그인을 하려면 Authenticator Session Store가 필요하다

  1. Authenticator: 인증자. 주어진 정보(Credentials)를 가지고 저장된 User정보와 비교하고, 적절한 경우 User객체를 반환할 수 있다면 뭐든지 좋다. Http Basic Auth, Token Auth, Session Auth, OAuth등 전부 가능.
  2. Session Store: 저장소. 세션 키와 암호화된 세션 데이터가 저장되는 곳. 저장이 가능한 곳이라면 어디든지 가능. 즉, 캐시, 데이터베이스, 파일 뭐든지 가능하다.


Authenticator는 pluggable하다. 다시 말해  1개 이상이 될 수 있으며서로 다른 방식이어도 문제없다.[각주:1]

django에서는 인증이 성공할 때까지 등록된 모든 Authenticator를 사용해 인증을 시도해 본다.




처리 흐름


django의 기본 로그인 방법은 SessionAuth + Database Session Store 조합으로 구현되어 있다.

이를 시간의 순서대로 정리하면,

  1. request발생 로그인 하지 않은 유저 (django에서는 이를 Anonymous User 라고 한다)가 로그인을 담당하는 뷰에 request를 보낸다.
  2. request가공 (블랙박스) request는 미들웨어를 지나며 가공된다.
  3. request Authenticator 도달 request는 흐르고 흘러 SessionAuthenticator의 authenticate() 함수에 도달한다
  4. 자격 증명[각주:2]을 사용해 User 객체 획득 authenticate()에서는 주어진 request에 딸려온[각주:3] credentials를 활용해 유저를 검색하고, 암호를 확인한다. 아무 문제 없을 경우 User객체를 반환한다.
  5. login() 도달 request 객체와 4의 User객체는 django.contrib.auth.login() 함수의 매개변수로 들어간다.
    1. session 생성, 저장 request.session.cycle_key()를 호출해 세션을 만들고, session store에 세션을 저장한다.
    2. session 전달 request.session[]형태로 값을 넣음으로써  set-cookie명령을 만들고 이를 유저에게 전달할 준비를 한다.
    3. CSRF 토큰 생성, 전달 rotate_token()을 실행해 csrf 토큰을 발행한다. 5.2와 같이 이 또한 유저에게 전달된다.
    4. Signal 전파 로그인이 성공했음을 Signal로써 알린다. 이 Signal을 수신하는 모듈들에 의해 각종 후처리가 트리거된다. django 기본은 후처리는 last_login을 업데이트 하는 것.




이제 사용자가 다음 request를 보낼 때에는 세션 정보가 http header에 포함되어 전송된다.

request에 포함된 세션 정보는 서버에 도착하고, 적합한 django SessionStore를 사용해 값을 불러오고, 인식한다.


따라서 WAS를 클러스터링 할 경우 당연한 이야기지만 session store는 공유 저장소를 사용해야 한다.

성능을 높이려면 database를 사용하기 보단 redis나 memcached를 사용해 퍼포먼스를 높이는 것이 좋다. 이를 위해선 직접 구현하거나, 구현한 라이브러리를 사용하면 된다.

redis를 사용한 session store는 잘 구현되어 있는 듯...?




  1. 편의성을 높이다 보면 session, token, oauth1, oauth2가 주렁주렁 붙는다. [본문으로]
  2. 기본값은 두 프로퍼티다. 아이디에 해당하는 username과 암호에 해당하는 password [본문으로]
  3. request.POST 또는 request.GET에 들어있다 [본문으로]

'WebDev' 카테고리의 다른 글

DRF file upload (파일 업로드)  (0) 2016.01.23
DRF + CORS + CSRF + AJAX 하에서 개발하기  (0) 2016.01.21
django CSRF disable (CSRF 해제)  (0) 2016.01.20
django class-based view  (0) 2016.01.15
Django Url  (0) 2016.01.14