Session 인증과 Token 인증
- (유저입장)
- 사이트에 접속
- ID/PW입력
- 왠지는 모르지만 로그인이 유지됨 <- 이걸 로그인했다 라고 생각
- 로그인이 되어있다 -> 인증이 되어있다
- Authentication!
Django(Web application) - Session인증
- Login을 했을 때 (Django의 login함수)
- Session에 각 User를 특정할 수 있는 Hash값을 저장 User1 -> hash문자열1 User2 -> hash문자열2…
- 해당 Hash문자열을 Client에 전달 (Response)
- Django Template에서는 해당 Hash문자열을 Cookie에 저장
- 이후 Request에는 Cookie에 저장된 Hash문자열을 항상 보냄
- Django는 전달받은 Hash문자열이 hash문자열1 일 경우, 현재 Request에 User1이 인증되어 있는것으로 취급
DRF(RESTful API Framework) - Token인증
- Login(정확히는 authenticate)을 했을 때 (User credential을 전달받음. 일반적으로는 username/password)
- 해당 User를 특정할 수 있는 Hash값을 DB에 저장
- Session에 저장된 Hash값을 특정할 수 있는 Token을 생성
- 생성한 Token을 Login Request의 Response로 돌려줌
- 해당 Token이 Request의 Header에 담겨 올 경우, 그 Request는 전달받은 Token에 해당하는 User가 인증된 상태로 취급
- -> [Header] Authorization: Token “토큰문자열”
- LoginAPIView username/password를 전달받고 token을 돌려주기
- 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에서 위 과정을 자동화. 코드를 참고할 것.
클라이언트측
- 자신이 갖고있는 token이 없을 경우
- -> 로그인 창을 띄워줌
- 갖고있는 token이 있지만, 정상적으로 요청에 실패한 경우
- -> token이 유효하지 않거나 만료됨
- -> 로그인 창으로 이동
- 갖고있는 token이 있고, 요청에 성공
- -> 올바른 token이며, 로그인 된 상태로 취급