안녕하세요! 현재 Django 1.8(+ Django Rest Framework)과 Ang

 
Dae-won Seo

안녕하세요!
현재 Django 1.8(+ Django Rest Framework)과 Angular 1.4를 이용해서 웹서비스를 만들고 있는데, CSRF 문제 때문에 질문 드립니다.

Django와 Angular를 다른 서버에 띄워서 개발하고 있는데요,
로그인을 위해서 Angular에서 Django의 로그인 API를 호출해야 할 때, 쿠키에 CSRF 토큰을 담아서 보내야 합니다.

그런데 Angular 입장에서 토큰을 쿠키에 담아 보내려면, 먼저 장고 서버에 갔다 와야 하는데,
일단은 로그인 하기 전에, 먼저 Django의 로그인 Form 태그가 있는 Template을 호출해서 쿠키를 받아오고 있습니다.
그런데 화면에 그리지도 않을 HTML을(실제 쓰는 로그인 HTML은 Angular가 보내주기 때문에…) 쿠키 하나 때문에 통째로 가져오는게 너무 찝찝한 상황입니다.

고수 분들은 이 경우에 보통 어떤식으로 처리하시는지 궁금합니다.
감사합니다!

  • Youngsoo Jung

    좀 다른 얘기지만, 장고 자체가 풀스택에 가까운 프레임워크라서 앵귤러 등 프론트앤드 프레임워크를 같이 쓰면 중복이 많습니다. 바둑으로 예를들면 빈삼각이 많아진다고 할까요. 고심끝에 저는 장고만 씁니다.

    Enoch Lee

    https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax
    이 곳을 참조하시면 될듯 합니다.

    Ju-won Lee

    app.config([‘$httpProvider’,
    function($httpProvider) {

    // csrf token
    $httpProvider.defaults.xsrfHeaderName = ‘X-CSRFToken’;
    $httpProvider.defaults.xsrfCookieName = ‘csrftoken’;

    // ajax header
    $httpProvider.defaults.headers.common[‘X-Requested-With’] = ‘XMLHttpRequest’;
    }
    ]);

    $httpProvider 객체에 설정을 해 두시면 애플리케이션에서 $http 이용해 보내는 모든 리퀘스트에 토큰이 박힙니다. ㅎㅎ

    Chinseok Lee

    csrf 처리를 할려면, 일단 해당 서버로부터 csrf_token 값을 가져올 수 밖에 없죠.

    그런데 웹페이지에서 일반적인 post 요청이 아니라, api 뷰를 호출하는 것이기 때문에 csrf 를 끌 수도 있을 듯 하네요.

    특정 URL 에 대해 csrf 를 끌려면 미드웨어를 작성해서, CsrfViewMiddleware 전에 해당 URL 패턴에 대해 request.csrf_processing_done = True 설정을 할 수도 있겠습니다.
    https://github.com/django/django/blob/master/django/middleware/csrf.py#L110

    Dae-won Seo

    일단 지금까지 적용한 방법은 rotate_token만 수행하는 get api를 만들고 post 호출 전에 한번 호출하는 방법으로 변경했습니다 ㅎㅎ..

    Sun Wook Kim

    로그인 할때는 Permission을 AllowAny 로 하셔서
    아이디랑 비번이 맞을때 토큰을 보내주면 안되나요?
    왜 로그인 하기도 전에 토큰을 받아와야하나요??

Advertisements