recordingbetter's devlog

Python, Django, DRF, Postgresql, AWS, Docker....

Session 인증과 Token 인증

02 August 2017


  1. (유저입장)
  2. 사이트에 접속
  3. ID/PW입력
  4. 왠지는 모르지만 로그인이 유지됨 <- 이걸 로그인했다 라고 생각
  • 로그인이 되어있다 -> 인증이 되어있다
  • Authentication!

Django(Web application) - Session인증

  1. Login을 했을 때 (Django의 login함수)
  2. Session에 각 User를 특정할 수 있는 Hash값을 저장 User1 -> hash문자열1 User2 -> hash문자열2…
  3. 해당 Hash문자열을 Client에 전달 (Response)
  4. Django Template에서는 해당 Hash문자열을 Cookie에 저장
  5. 이후 Request에는 Cookie에 저장된 Hash문자열을 항상 보냄
  6. Django는 전달받은 Hash문자열이 hash문자열1 일 경우, 현재 Request에 User1이 인증되어 있는것으로 취급

DRF(RESTful API Framework) - Token인증

  1. Login(정확히는 authenticate)을 했을 때 (User credential을 전달받음. 일반적으로는 username/password)
  2. 해당 User를 특정할 수 있는 Hash값을 DB에 저장
  3. Session에 저장된 Hash값을 특정할 수 있는 Token을 생성
  4. 생성한 Token을 Login Request의 Response로 돌려줌
  5. 해당 Token이 Request의 Header에 담겨 올 경우, 그 Request는 전달받은 Token에 해당하는 User가 인증된 상태로 취급
    • -> [Header] Authorization: Token “토큰문자열”
  6. LoginAPIView username/password를 전달받고 token을 돌려주기
  7. FacebookLoginAPIView
    • 7-1. accesstoken을 받음
    • 7-2. 해당 token을 debug해서 유효한지 검사
    • 7-3. 해당 token을 사용해 facebook_user_id를 가져옴
    • 7-4. 가져온 facebook_user_id에 해당하는 Django User가 있는 지 확인, 없으면 생성
    • (만약 이메일이 반드시 필요할경우)
      • -> 유저가 없다는 response를 보내주면서, facebook_user_id를 포함
      • -> 클라이언트에서는 facebook_user_id를 포함해서 나머지 정보를 입력할 수 있는 창을 생성
      • -> 나머지(이메일)정보를 입력 후 서버에 가입 요청
      • -> FacebookSignupAPIView등의 다른 APIView에서 해당 요청을 처리
      • -> 이후는 아래과정 진행
    • 7-5. 생성 또는 가져온 유저에 대해 존재하는 Token을 가져오거나 생성
    • 7-6. get_or_create한 Token을 전달

Django rest auth <- DRF에서 위 과정을 자동화. 코드를 참고할 것.

클라이언트측

  1. 자신이 갖고있는 token이 없을 경우
    • -> 로그인 창을 띄워줌
  2. 갖고있는 token이 있지만, 정상적으로 요청에 실패한 경우
    • -> token이 유효하지 않거나 만료됨
    • -> 로그인 창으로 이동
  3. 갖고있는 token이 있고, 요청에 성공
    • -> 올바른 token이며, 로그인 된 상태로 취급
blog comments powered by Disqus