카테고리 없음

[자바 스크립트] 클라이언트 측에서 XSRF 쿠키 설정

행복을전해요 2021. 2. 24. 03:10

서버가 쿠키를 보내야하는 이유 ...

따라서 서버는 앱의 두 번째 요청이 앱에서 정확히 왔음을 알 (인증) 할 수 있습니다 (동일한 앱이 첫 번째 요청 응답의 유일한 수신자이기 때문). 토큰이 매핑되는 사용자로부터 직접 파생되었으므로 토큰이 권한 부여에 사용되지 않는다고 말합니다. 예를 들어 토큰을 사용하여 다른 사용자를 삭제할 수 없습니다. 그러나 코드가 여전히 악용 될 수 있으며 해당 토큰이 악성 코드로 손상 될 수 있지만 나중에 생각해 보겠습니다.

... 클라이언트에서 설정하는 것이 아니라 ...

커뮤니케이션 이전에 설정된 모든 것은 다른 목적으로 사용 됩니다. https://en.wikipedia.org/wiki/Shared_secret 또는 https://en.wikipedia.org/wiki/Symmetric-key_algorithm을 참조하세요 . 귀하의 앱은 클라이언트에 미리 설정하지 않은 이유에 대한 답변을 공개합니다.

간단한 자바 스크립트와 생성 된 임의의 uuid 값을 사용합니까?

uuid를 설정하는 것은 누구나 할 수 있기 때문에 무의미합니다. 서버는 앱의 uuid와 해커의 것을 구별 할 수 없습니다.

또한 모든 사람이 액세스 할 수있는 공용 앱이 있지만 여전히 csrf로부터 보호해야하는 경우 ...

하지만 앱 (및 그 안의 API)이 공개 된 경우 보호해서는 안됩니다. 시도해보십시오 curl https://api.github.com/users/mongodb/repos. 최근에 쿠키를 제공하여 Bamboo api의 XSRF 보호를 비활성화 할 수 있음을 배웠습니다 atl.xsrf.token=no-check(헤더를 통해서도 작동합니다. JSESSIONID는 실제 인증에 여전히 사용됨).

세션 쿠키가없는 경우 서버 측은 어떤 사용자에게 어떤 토큰을 전송하는지 어떻게 기억합니까?

XSRF 토큰은 일반적으로 사용자 지정 X-HTTP 헤더로 제공됩니다. 또는 경로 / 쿼리 매개 변수로도 쿠키가 필요하지 않습니다.

XSRF는 API가 마지막 요청 (또는 GET무료로 새 토큰을받는 이니셜)과 함께 앱에 제공 한 토큰을 사용하여 앱의 다음 요청을 인증하는 데만 사용됩니다 . 다른 답변이 올바르게 지적했듯이 서버는 모든 멱 등성 요청으로 토큰을 변경하기로 결정할 수 있습니다. 표준 관행은 모든 요청에 ​​대해 새 토큰을 갖는 것이며 어쨌든 생성하는 것이 저렴합니다.

마지막으로, 몇 가지 악용 시나리오에 대해 생각해보십시오.

  • 일부 자바 스크립트를 삽입하고 토큰이있는 앱의 쿠키 (또는 dom 또는 js 네임 스페이스 또는 일부 js getter를 통해 토큰에 액세스)에 액세스 DELETE하면 API에 인증 된 요청을 할 수 있습니다.
  • 앱을 내 서버로 리디렉션하고 (모든 종류의 DNS 스푸핑, SSL 없음 등) 토큰에 도달하면 다음과 같은 DELETE경우 다음 요청이 거부 될 수 있습니다.
    • 서버는 모든 요청에 ​​대해 새 토큰을 기대하고 ...
    • 당신은 그 사이에 그 요청을하는 것이 나보다 빠르다. 내가 다시 시도하거나 ...
    • 서버는 동일한 토큰을 가진 여러 요청이 다른 IP에서 오는 것을 볼 수있을만큼 똑똑하고 적어도 Gmail과 같은 경고를 제공합니다.
  • 서버 API의 응답을 리디렉션하면 (새 토큰이 있음을 의미) 내 DELETE요청이 성공하지만 다음 요청은 부실 리소스 (내 요청이 어떻게 든 수정 됨)에 액세스하고 있다는 경고를 표시합니다. 나는 그것이 당신의 세션에 대한 낙관적 잠금이라고 생각합니다.

요약하면 공용 API에 csrf를 사용하지 마십시오. 데이터를 렌더링 할 때 사용하고 코드 또는 멱등 호출에 원격 리소스를 포함하지만 잘 보호합니다. 모든 것이 이해되기를 바랍니다.

-------------------

CSRF 토큰을 갖는 요점은 일부 악의적 인 사용자 또는 프로그램이 다른 사용자를 가장하지 않도록하는 것입니다. 전통적으로 CSRF 토큰은 서버에 의해 생성되고 해당 사용자의 세션에 저장됩니다. 그러면 해당 사용자에 대한 쿠키가 자동으로 생성되고 백엔드 코드는 양식 제출을 용이하게하기 위해 CSRF 토큰에 대한 숨겨진 양식 필드를 추가해야합니다. 따라서 사용자가 POST / PUT / DELETE 요청을 서버에 보낼 때마다 서버의 CRSF 토큰이 사용자가 제출 한 토큰과 일치하는지 항상 확인합니다.

또한 모든 사람이 액세스 할 수 있고 여전히 csrf로부터 보호해야하는 공용 앱이있는 경우 서버 측은 세션 쿠키가없는 경우 어떤 사용자에게 어떤 토큰을 전송하는지 어떻게 기억할까요?

글쎄, 서버는 사용자가 인증되었는지 실제로 신경 쓰지 않습니다. 모든 사용자를 위해 사이트를 방문하는 당신은 해야 토큰 CSRF를 작성하고 귀하의 사이트에 비 멱등 요청을 만들어 어떤 형태 또는 아무것도에 추가합니다. 세션의 사용자에 대한 CSRF 토큰을 추가하면 쿠키가 생성되어 브라우저에 제공되며 로그온 할 필요가 없습니다. 다시 말하지만, 이것은 공격자의 삶을 어렵게 만들 것입니다. 첫째, 보낼 올바른 쿠키가없고 둘째, 사용자가 생성 한 CSRF 토큰을 추측하는 것과는 다릅니다.



출처
https://stackoverflow.com/questions/22080064