jc.jang

21강 중복 로그인 막기 (개선) 본문

Django/Django - 인증편

21강 중복 로그인 막기 (개선)

jangstory 2019. 9. 11. 12:33

주제

  • 중복 로그인을 막기위해 구현한 코드를 수정한다.

노트

  • 17강에서 중복 로그인을 막기 위해 Usersession 모델을 만들고 로그인할 때 마다 세션 값을 저장했다.
  • 로그인 할 때 마다 Usersession을 확인하고 과거에 로그인한 세션에 'kicked'라는 key에 True를 할당하여 로그아웃하는 미들웨어도 추가했다.
  • 하지만 test1로 로그인하고 다시 로그인 페이지로가서 test2로 로그인할 경우 UserSession 관련 에러가 발생한다.

 

  • 무슨 에러일까?
  • 디버깅 해보니, session_key가 없어서 발생하는 에러였다.
  • 1. test1로 로그인한 상태 -> 2. test2의 ID, PASSWORD 입력 후 로그인 시도 -> 3. test2의 session_key 값을 UserSession 모델에 저장 -> 로그인 성공
  • 위와 같은 순서로 로그인이 진행되는데, 어떠한 이유에서 인지는 모르겠지만 2단계에서 request.session_session_key 값이 none으로 나온다. (제발 쿠키와 세션에 대해 알아보자.)
  • 그래서 아래와 같이 수정했다.

 

  • accounts/models.py
def kicked_my_other_sessions(sender, request, user, **kwargs):
    for user_session in UserSession.objects.filter(user=user):
        session_key = user_session.session_key
        session = SessionStore(session_key)
        # session.delete()
        session['kicked'] = True
        session.save()
        user_session.delete()

    if not request.session.session_key:
        request.session.create()
    session_key = request.session.session_key

    UserSession.objects.create(user=user, session_key=session_key)
  • request.session.session_key가 없을 때 session_key 값을 만들어 준다.
  • django session 소스코드(링크)를 참고하여 session_key 값이 없을 때 create하면 된다.
  • request.session.create() vs request.session.save() stackoverflow 답변(링크)
  • 나도 처음에 save를 사용했지만, save를 사용하면 기존의 세션 키와 충돌이 일어 날 수 있어서 create를 사용하는게 더 안전하다고 한다.

질문

  • 새로운 로그인을 시도하면 세션이 none으로 설정되는 것 같다. --> 맞는지 모르겠다ㅠ
  • 쿠키와 세션을 알아보자!

날짜

  • 오전 11시, 20190911

 

Comments