본문 바로가기

[Python]/[Flask & Django]

[Django-Rest-Framwork] Postman에서 csrftoken 자동화하기

728x90

 

< Postman에서 csrftoken 자동화하기 >

 

 

빈둥거리며 살다가 이제야 정신을 차리고, 다시 하던것들을 조금씩 정리하고 기록으로 남기기로 했다.

  학교에서 진행하는 해커톤을 준비하면서 Django-Rest-Framwork로 간단한 rest-api서버를 만들었고 이는 다음과 같다. 하지만 내 고민은 이를 테스트하기 위한 환경이였다. 물론 해당 url를 찍어 들어가면 문제는 없었지만, json 방식의 응답에 api요청들이 잘 처리되는지 확인할 필요가 있었다. 

그래서 찾아낸 방법이 postman이다. www.postman.com

 

Postman | The Collaboration Platform for API Development

Simplify each step of building an API and streamline collaboration so you can create better APIs—faster

www.postman.com

 

 api를 테스트하기 위한 용도로 개발된 프로그램이였는데 써보니까 굉장히 유용하고 또 편리했다. get방식의 요청은 별다른 설정없이 성공을 했지만 post나 기타 csrftoken이 문제가 될 수 있는 요청에서는 문제가 발생했다. (django-rest-framework에서 csrftoken관련 보안을 모두 풀었음에도 csrftoken이 문제가 되는 것은 그만큼 프레임웍이 잘 만들어진 것인지 뭔지;;;) 따라서 이를 해결하기 위해 구글링을 조금 했었는데 찾아낸 방법을 여기 정리하고자 한다.  좀 더 자세한 설명은 아래 포스팅을 참고하면 된다.

https://medium.com/hackernoon/automatically-set-csrf-token-in-postman-django-tips-c9ec8eb9eb5b

 

Automatically Set CSRF Token in Postman — Django Tips

Django has inbuilt CSRF protection mechanism for requests via unsafe methods to prevent Cross Site Request Forgeries. When CSRF protection…

medium.com

 

아래 코드가 내가 api를 테스트하기 위해 작성한 코드이다. post방식의 request가 갔을때 미리 만들어놓은 serializer의 양식을 통과한다면 해당 data에 대한 response를 리턴하며 user데이터를 생성하고 db에 저장한다. 

@api_view(['POST'])
def userCreate(request):
	serializer = userSerializer(data=request.data)

	if serializer.is_valid():
		serializer.save()

	return Response(serializer.data)

 

아래는  django에서 runserver명령어로 서버를 실행시킨 상태의 화면이며 요청을 수행하자 csrftoken이 다음과 같이 생성된 것을 확인할 수 있었다. 문제는 서버을 열때마다, 혹은 ngrok으로 외부포트를 연다면 해당 작업을 수행할 때 마다 csrftoken을 얻어서, 이를 postman에서 테스트를 할 때 일일이 변경된 토큰을 붙여넣어야 한다는 것이다.

 

이번 포스팅의 핵심은 이 csrftoken을 자동적으로 갱신하게 만드는 것으로, postman의 'Tests'기능을 사용한다. 

먼저 postman을 실행시키고 수행하고자 하는 env를 만든 다음, 해당 env안에서 request부분에 Tests에 다음 코드를 붙여넣는다. 코드의 의미 그대로 postman에서 받은 csrftoken을 'csrftoken'이라는 변수에 저장한다는 의미이다.

var xsrfCookie = postman.getResponseCookie("csrftoken");
postman.setEnvironmentVariable('csrftoken', xsrfCookie.value);

 

그리고 header에 들어가 content-type과 x-csrftokend을 key-value에 맞게 집어넣는다. 이전에 서버에 호출을 한 적이 있다면 하단의 body배너의 cookies안에 아까 크롬>application에서 확인했던 csrftoken이 있는것을 볼 수 있다.

 

 여기까지 완료되었다면 한번 테스트를 진행해보기로 하자. body를 열어 key와 value를 요청형식에 맞게 기입해준다. 나는 user-create api라서 간단하게 username과 password를 넣어주었다. request를 보내면 아래의 body에 보이듯이 잘 만들어진 것을 확인할 수 있다.

마찬가지로 서버 url의 user-list로 유저 결과를 찍어보니, post요청으로 보낸  유저가 잘 생성된 것을 확인할 수 있다. 

 

728x90