[django]Session Authentication과 Cookie

Felix, JooHwan Yeon·2021년 9월 15일
0

Session Authentication (이하 세션인증)

쟝고 세션인증 documentation

사용자가 서버에 POST, PUT, DELETE 등의 방식으로 요청을 하면 해당 사용자가 접근권한을 가지고 있는지 판단하는 것이 필요하다. 보통 웹은 Session Authentication을 사용하며, 특정 시간 또는 브라우저에 접속한 시간동안 존재하는 세션이라는 개념을 사용한다. 앱에서는 회원과 연결된 토큰을 통해 인증하는 Token Authentication을 사용한다. 대파멘 서비스는 현재 웹이 기반이기 때문에 세션인증을 사용할 것이다.

MiddleWare 미들웨어

Middleware is a framework of hooks into Django’s request/response processing. It’s a light, low-level “plugin” system for globally altering Django’s input or output.

쟝고는 사용자의 request 객체를 받아 처리해서 response 객체를 리턴한다. 그리고 가장 원시적인 requestresponse 를 권한 등의 가공을 거친 객체로 만들어주기 미들웨어가 사용된다.

세션인증과 관련해서 가공을 해주기 위해서 django.contrib.sessions.middleware. SessionMiddleware 를 사용한다.

1. 클라이언트 로그인 요청 (/account/login)

클라이언트에서 로그인을 요청하면 특정 view는 authenticate() 함수를 사용하여 사용자를 인증.

// 로그인 요청하기
apis.post('account/login/', data)
# views.py
user = authenticate(request, username=username, password=password)

2. 서버 login() 함수 실행

login() 함수를 통해 세션데이터를 데이터베이스의 세션 테이블에 저장하고(최초 migrate에서 생성되었음), 해당 request에 대한 response로 Set-Cookie 키에 sessionidcsrftoken을 전달한다.

if user is not None:
	login(request, user)

2021-09-15-1-1.png

브라우저는 response 객체의 Set-Cookie를 자동으로 브라우저의 쿠키로 저장한다.

4. current_user 로직 정의하기

홈도메인으로 재접속을 하면 Context Api는 초기화되었기 때문에, 로그인 데이터가 존재하지 않는다. 그러나 세션 데이터는 쿠키로 브라우저에 저장되어 있으므로, 홈도메인에 접속하면 세션 데이터를 서버에 보내 현재 유저를 다시 확인하고 Context에 저장하는 로직을 만든다. 그리고 이러한 로직을 처리할 current_user view를 쟝고에서 정의한다.

apis.get('/account/current_user/')
@api_view(['GET'])
def current_user(request):
    user = request.user
    if user is not None:
        serializer = UserSerializerWithoutPassword(user)
        return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        return Response({}, status=status.HTTP_200_OK)

5. axios에서 withCredentials 설정

브라우저가 서버로 요청을 보낼 때, 쿠키를 포함해서 보내게 해주기 위해서 withCredentials: true 를 설정한다. 요청을 보낼 때마다 설정할 수 있지만, default로 설정할 수 있다.

withCredentials 속성은 headers에 포함되지 않는다.

axios.defaults.withCredentials = true;

6. axios에서 xsrfCookieName, xsrfHeaderName 설정

세션인증을 사용할 때, csrf token을 포함해서 보내야 한다.

  • xsrfCookieName - 서버로부터 초기에 세션데이터를 response로 받을 때 csrf token도 함께 받게 되는데, 이 쿠키의 키(key)를 xsrfCookieName 으로 설정
  • xsrfHeaderName - request 로 csrf token을 header 담아서 보낼 때 이름을 xsrfHeaderName 으로 설정한다. xsrfHeaderName 는 쟝고와 맞춰주어야 한다.

csrf token과 관련한 포스팅도 작성해봐야겠다.

쟝고 csrf token documentation

profile
🚀 세상과 인간이 궁금한 사상가, 그 속에서 가치를 찾는 공학자이자 사업가

0개의 댓글