2011-11-10 2 views
6

인터넷을 검색 한 후 사람들은 일반적으로이 상황을 처리합니다. 프론트 엔드는 csrf 토큰의 쿠키를 사용자에게 보낼 수있는 장고보기 기능을 통해 생성됩니다. 사용자가 ajax를 사용하여 서버에 요청하면 csrf를 서버로 전송하는 ajaxSend 동작을 다시 작성할 수 있습니다.Django CSRF 백엔드와 프론트 엔드가 분리 된 경우

그러나 제 상황은 프론트 엔드가 백엔드에서 완전히 분리 된 것입니다. 즉, 프론트 엔드가 nginx를 실행하는 전용 서버에 있으며, 오직 하나의 html만이 hashbang을 사용하여 다른 모든 페이지를 제공합니다 . 내 백 엔드가 다른 도메인 이름을 사용하는 다른 서버에서 실행되고 있으며이 경우 클라이언트가 csrf 쿠키를 얻는 방법은 무엇입니까? 내 백엔드 만 json API를 반환했습니다.

감사합니다.

+0

누군가에게 대답하십시오.이 / – holms

답변

0

If you look at the CRSF token source: you can see that all the csrf_middleware does it check the cookie against the post value. 쿠키가 이미 ajax를 통해 설정되어 있어야하므로 게시 값을 서버에 다시 가져와야합니다. If you look at the template tag source you can see that it is just taking the variable out of the context. 사용 가능한 경우 문맥에서 내용을 빼내거나 calling the context processor directly. POST 변수 crsf_token으로 다시 보내면됩니다.

0

frontend는 도메인 frontend.example.com과 백엔드 도메인 backend.example.com을 갖고 있습니다. (장고 휴식 프레임 워크와 같은 경우) 보안 레이어를 활성화 할 수있는 두 가지 방법, 즉. CSRF 보호 또는 CORS CORS를 들어

다음
pip install django-cors-headers 

가 INSTALLED_APPS, MIDDLEWARE_CLASSES이를 구성하고 CORS_ORIGIN_WHITELIST에 프론트 엔드 도메인을 추가 할 수 있습니다. 당신이 각도 앱을 사용하는 경우

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com' 
) 

CORS는 다른 frontend.example.com CSRF를 들어


보다

CSRF_COOKIE_DOMAIN = ".mydomain.com" 

어떤 도메인에서 발생하는 모든 HTTP 요청을 차단합니다 아래처럼하세요,

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
$httpProvider.defaults.withCredentials = true; 

을 누른 다음 HTTP 요청을하는 동안 헤더를 추가하십시오.

headers : { 
    "x-csrftoken" : $cookies.csrftoken 
} 
관련 문제