developer tip

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

optionbox 2020. 7. 25. 10:51
반응형

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: 브라우저 데이터 저장소에도 있습니다. 차이점은 다음과 같습니다. 사용자가 브라우저 창을 닫으면 데이터가 삭제됩니다. 그러나 webapp가 여러 페이지로 구성되어 있으면 여전히 유용합니다. 따라서 다음을 수행 할 수 있습니다.

    • 사용자가 로그인 한 후 토큰을 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

A JWT, if used without Cookies, negates the need for a CSRF token - BUT! by storing JWT in session/localStorage, your expose your JWT and user's identity if your site has an XSS vulnerability (fairly common). It is better to add a csrfToken key to the JWT and store the JWT in a cookie with secure and http-only attributes set.

Read this article with a good description for more info https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

You can make this CSRF protection stateless by including a xsrfToken JWT claim:

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

So you will need to store the csrfToken in localStorage/sessionStorage as well as in the JWT itself (which is stored in a http-only and secure cookie). Then for csrf protection, verify that the csrf token in the JWT matches the submitted csrf-token header.

참고URL : https://stackoverflow.com/questions/21357182/csrf-token-necessary-when-using-stateless-sessionless-authentication

반응형