[authentication] Stateless (= Sessionless) 인증을 사용할 때 CSRF 토큰이 필요합니까?

애플리케이션이 상태 비 저장 인증 (HMAC과 같은 것을 사용)에 의존 할 때 CSRF 보호를 사용해야합니까?

예:

  • 단일 페이지 앱이 있습니다 (그렇지 않으면 각 링크에 토큰을 추가해야합니다 : <a href="...?token=xyz">...</a>.

  • 사용자는 POST /auth. 인증이 성공하면 서버는 일부 토큰을 반환합니다.

  • 토큰은 단일 페이지 앱 내의 일부 변수에 JavaScript를 통해 저장됩니다.

  • 이 토큰은와 같은 제한된 URL에 액세스하는 데 사용됩니다 /admin.

  • 토큰은 항상 HTTP 헤더 내에서 전송됩니다.

  • Http 세션과 쿠키가 없습니다.

내가 이해하는 한, 브라우저가 토큰을 저장하지 않기 때문에 크로스 사이트 공격을 사용할 가능성이 없어야합니다 (?!). 따라서 자동으로 서버로 보낼 수 없습니다 (쿠키를 사용할 때 발생하는 일입니다.) 세션).

내가 뭔가를 놓치고 있습니까?



답변

인증에 쿠키를 사용 하지 않는 CSRF +에 대한 정보를 찾았습니다 .

  1. https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
    “쿠키에 의존하지 않기 때문에 교차 사이트 요청으로부터 보호 할 필요가 없습니다.”

  2. http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
    “쿠키 방식으로 내려 가면 사이트 간 요청을 피하기 위해 CSRF를 수행해야합니다. 당신이 보게 될 JWT를 사용할 때 잊어 버려. ”
    (JWT = 상태 비 저장 앱을위한 토큰 기반 인증 인 Json 웹 토큰)

  3. http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
    “CSRF 취약성 위험없이 인증을 수행하는 가장 쉬운 방법은 단순히 쿠키를 사용하여 사용자를 식별하지 않는 것입니다. “

  4. http://sitr.us/2011/08/26/cookies-are-bad-for-you.html
    “CSRF의 가장 큰 문제는 쿠키가 이러한 유형의 공격에 대한 방어를 전혀 제공하지 않는다는 것입니다. 쿠키 인증을 사용하는 경우 CSRF로부터 보호하기 위해 추가 조치를 취해야합니다. 취할 수있는 가장 기본적인 예방 조치는 애플리케이션이 GET 요청에 대한 응답으로 어떠한 부작용도 수행하지 않도록하는 것입니다. “

인증을 위해 쿠키를 사용하지 않는 경우 CSRF 보호가 필요하지 않다는 더 많은 페이지가 있습니다. 물론 다른 모든 것에 쿠키를 사용할 수 있지만 내부에 이와 같은 것을 저장 하지 마십시오session_id .


사용자를 기억해야하는 경우 다음 두 가지 옵션이 있습니다.

  1. localStorage: 브라우저 내 키-값 저장소입니다. 저장된 데이터는 사용자가 브라우저 창을 닫은 후에도 사용할 수 있습니다. 모든 사이트가 자체 저장 공간을 확보하기 때문에 다른 웹 사이트에서 데이터에 액세스 할 수 없습니다.

  2. sessionStorage: 또한 브라우저 내 데이터 저장소입니다. 차이점은 사용자가 브라우저 창을 닫으면 데이터가 삭제된다는 것입니다. 그러나 웹앱이 여러 페이지로 구성된 경우 여전히 유용합니다. 따라서 다음을 수행 할 수 있습니다.

    • 사용자가 로그인하면 토큰을 sessionStorage
    • 사용자가 링크를 클릭하면 새 페이지가로드됩니다 (= 실제 링크, 자바 스크립트 콘텐츠 대체 없음).
    • 여전히 토큰에 액세스 할 수 있습니다. sessionStorage
    • 로그 아웃하려면 수동으로 토큰을 삭제 sessionStorage하거나 사용자가 브라우저 창을 닫을 때까지 기다리면 저장된 모든 데이터가 지워집니다.

(둘 다 여기를보세요 : http://www.w3schools.com/html/html5_webstorage.asp )


토큰 인증에 대한 공식 표준이 있습니까?

JWT (Json Web Token) : 아직 초안이라고 생각하지만 이미 많은 사람들이 사용하고 있으며 개념은 간단하고 안전 해 보입니다. (IETF : http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25 )
사용 가능한 많은 프레임 워크를위한 라이브러리도 있습니다. 그것을 위해 구글!


답변

TL; DR

쿠키없이 JWT를 사용하면 CSRF 토큰이 필요하지 않습니다.하지만! JWT를 session / localStorage에 저장하면 사이트에 XSS 취약성이있는 경우 JWT와 사용자의 신원이 노출됩니다 (일반적으로). csrfTokenJWT에 키 를 추가하고 securehttp-only속성이 설정된 쿠키에 JWT를 저장하는 것이 좋습니다 .

자세한 내용은 https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage에 대한 좋은 설명과 함께이 기사를 읽으십시오.

xsrfToken JWT 클레임을 포함하여이 CSRF 보호를 상태 비 저장으로 만들 수 있습니다.

{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}

따라서 csrfToken을 localStorage / sessionStorage 및 JWT 자체 (http 전용 및 보안 쿠키에 저장 됨)에 저장해야합니다. 그런 다음 csrf 보호를 위해 JWT의 csrf 토큰이 제출 된 csrf-token 헤더와 일치하는지 확인합니다.


답변