5/18

justyoon·2023년 5월 18일
0

소스코드는 퓨어장고로 이뤄졌으며, postman에서 "detail": "CSRF Failed: CSRF token missing or incorrect." 에러가 발생할 때 해결한 과정을 정리한 글입니다.

Missing CSRF token

Django는 기본적으로 CSRF 보호를 사용하여 Cross-Site Request Forgery 공격을 방지합니다. Postman으로 테스트할 때 요청 헤더에 CSRF 토큰을 포함하지 않은 경우 403 Forbidden 응답이 발생할 수 있습니다.

from ChatGPT

원래 사이트에서 테스트를 할 땐 csrf token이 자동으로 웹사이트에서 생성이 되었겠지만, postman이라는 별개의 앱에서 테스트를 진행하려면 csrf token을 매번 웹사이트에 들어가서 가져와줘야 한다.

시간과 체력이 부족하다
사력을 다해 게을러져야 한다

postman Tests탭에 아래 코드를 붙여넣는다

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

postman으로 쿠키 get요청을 할 때마다 변경되는 값을 글로벌 변수로 csrftoken에 지정해주는 것 같다.
헤더에 변경되는 토큰값을 받도록 {{csrftoken}}형태로 넣어준다.

초기 csrftoken값을 받아오기 위해 관리자계정을 하나 만들어주고 로그인 된 관리자계정의 csrftoken값을 {{csrftoken}}에 붙여넣어준다.

관리자 계정으로 로그인하고 csrftoken값을 넣어주었다. 한번만 해주면 자동화 되기 때문에 귀찮아도 관리자 계정은 꼭 만들어 준다.


Incorrect request format

Django의 view 혹은 API 엔드포인트는 특정 데이터 형식(예: JSON 또는 Form)을 예상할 수 있습니다. Postman에서 요청한 내용이 예상 형식과 일치하지 않으면 유효성 검사 오류가 발생하거나 요청 데이터를 처리하는 데 문제가 발생할 수 있습니다.

from ChatGPT

ValueError
raw - JSON 형식으로 요청을 보내면 500 에러가 뜬다.

500 상태코드는 크게

  • 서버 통신의 Timeout 시간 지연 오류
  • 서버 트래픽 과부하
  • 서버 언어의 구문 에러 (스크립트 문법 오류)

이런 경우에 발생한다고 하는데 시간 지연이나, 트래픽 과부하일 경우는 없으니 하나로 좁혀진다

Django에서의 데이터는 JSON과 같은 포맷이 아닌, 파이썬 객체의 형태로 저장된다.

  • 장고 템플릿 언어를 사용해 페이지를 만들었고
  • 응답역시 (GET,POST 두 형태의) HTML 형태로 받는다

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
??즉 raw-JSON 형태로 퓨어장고와 장고템플릿에 맞게 구성된 데이터요청을 보내면
서버는 요청 값을 읽지 못하기 때문에 에러가 발생하는 것이다.??
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

DRF Serialize

API는 이런 데이터를 클라이언트에 보내주는 역할을 한다. 클라이언트가 데이터를 이해할 수 있도록 하기 위해선 기존의 파이썬 데이터를 읽을 수 있는 문자열(JSON 등)으로 변환하여 보내주어야 하고, 이렇게 파이썬 데이터 객체를 문자열로 변환하는 작업을 직렬화, Serialize라고 한다.
반대로 클라이언트가 DRF 서버에 데이터를 보내는 경우 클라이언트는 JSON 등 문자열 형태로 데이터를 보내게 된다. 이때 DRF 서버는 JSON 등 문자열을 파이썬 데이터 객체로 변환하게 되는데 이를 역직렬화, Deserialize라고 한다.

form-data로 전송을 하면 status 200이 리턴 된다.

참고자료

profile
with gratitude, optimism is sustainable

0개의 댓글