사용자가 서버에 POST, PUT, DELETE 등의 방식으로 요청을 하면 해당 사용자가 접근권한을 가지고 있는지 판단하는 것이 필요하다. 보통 웹은 Session Authentication을 사용하며, 특정 시간 또는 브라우저에 접속한 시간동안 존재하는 세션이라는 개념을 사용한다. 앱에서는 회원과 연결된 토큰을 통해 인증하는 Token Authentication을 사용한다. 대파멘 서비스는 현재 웹이 기반이기 때문에 세션인증을 사용할 것이다.
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
객체를 리턴한다. 그리고 가장 원시적인 request
와 response
를 권한 등의 가공을 거친 객체로 만들어주기 미들웨어가 사용된다.
세션인증과 관련해서 가공을 해주기 위해서 django.contrib.sessions.middleware. SessionMiddleware
를 사용한다.
/account/login
)클라이언트에서 로그인을 요청하면 특정 view는 authenticate()
함수를 사용하여 사용자를 인증.
// 로그인 요청하기
apis.post('account/login/', data)
# views.py
user = authenticate(request, username=username, password=password)
login()
함수 실행login()
함수를 통해 세션데이터를 데이터베이스의 세션 테이블에 저장하고(최초 migrate에서 생성되었음), 해당 request에 대한 response로 Set-Cookie
키에 sessionid
와 csrftoken
을 전달한다.
if user is not None:
login(request, user)
브라우저는 response 객체의 Set-Cookie
를 자동으로 브라우저의 쿠키로 저장한다.
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)
브라우저가 서버로 요청을 보낼 때, 쿠키를 포함해서 보내게 해주기 위해서 withCredentials: true
를 설정한다. 요청을 보낼 때마다 설정할 수 있지만, default
로 설정할 수 있다.
withCredentials
속성은headers
에 포함되지 않는다.
axios.defaults.withCredentials = true;
세션인증을 사용할 때, csrf token
을 포함해서 보내야 한다.
xsrfCookieName
- 서버로부터 초기에 세션데이터를 response
로 받을 때 csrf token도 함께 받게 되는데, 이 쿠키의 키(key)를 xsrfCookieName
으로 설정xsrfHeaderName
- request
로 csrf token을 header 담아서 보낼 때 이름을 xsrfHeaderName
으로 설정한다. xsrfHeaderName
는 쟝고와 맞춰주어야 한다.csrf token과 관련한 포스팅도 작성해봐야겠다.