Access-Control-Allow-Credentials 헤더는 정확히 무엇을합니까?


167

CORS를 사용하는 방법을 이해하려고 노력하고 있으며 Access-Control-Allow-Credentials헤더의 기능 에 대해 혼란스러워 합니다.

문서 는 말합니다

자격 증명 플래그가 true 일 때 요청에 대한 응답을 표시 할 수 있는지 여부를 나타냅니다.

그러나 나는 "노출 된"응답이 무엇을 의미하는지 이해하지 못한다.

자격 증명 플래그가 true로 설정되어있는 경우이 헤더가 true로 설정된 것을 실제로 설명 할 수있는 사람이 있습니까?


답변:


265

기본적으로 CORS는 출처 간 요청에 쿠키를 포함하지 않습니다. 이것은 JSON-P와 같은 다른 교차 출처 기술과 다릅니다. JSON-P에는 항상 요청에 쿠키가 포함되며이 동작으로 인해 사이트 간 요청 위조 ( CSRF) 라는 취약성 클래스가 발생할 수 있습니다 .

CORS에서 CSRF 취약점의 가능성을 줄이려면 CORS는 서버와 클라이언트 모두 요청시 쿠키를 포함 할 수 있음을 인정해야합니다. 이렇게하면 쿠키없이 수동적으로 발생하는 것이 아니라 쿠키가 능동적으로 결정됩니다.

클라이언트 코드가 있어야 설정된 withCredentials상의 특성 XMLHttpRequesttrue권한을 부여하기 위해.

그러나이 헤더만으로는 충분하지 않습니다. 서버 Access-Control-Allow-Credentials 헤더로 응답 해야합니다 . 이 헤더로 응답 true한다는 것은 서버가 쿠키 (또는 다른 사용자 자격 증명)가 출처 간 요청에 포함되도록 허용한다는 것을 의미합니다.

또한 출처 간 자격 증명 요청이 작동하도록하려면 브라우저가 타사 쿠키를 차단하지 않아야 합니다.

동일 출처 또는 교차 출처 요청에 관계없이 CSRF로부터 사이트를 보호해야합니다 (특히 요청에 쿠키가 포함 된 경우).


1
귀하의 질문에 대한 답변을 명확히했습니다. 기본적으로 JSON-P는 잘못하고 덜 안전합니다.
monsur

28
"노출"의 의미에 대해 언급하기 위해이 내용을 조금 추가하고 싶을뿐입니다. 사양은 GET 요청에 대한 사전 비행 (서버에서 자격 증명을 허용하는지 확인하기위한 추가 왕복)이 필요하지 않습니다. 사전 비행 대신 브라우저는 항상 요청하고 쿠키 withCredentials가 설정된 경우 쿠키를 보내지 만 응답을 받으면 withCredentials가 설정된 경우 응답에 액세스 권한이있는 경우 호출하는 자바 스크립트에만 결과를 전달 / 노출합니다 -Control-Allow-Credentials 헤더 세트. 헤더가 없으면 응답을 노출시키지 않고 효과적으로 차단합니다.
heavi5ide

4
@ heavi5ide, 예, 브라우저가 클라이언트 코드에 응답을 노출하지 않더라도 쿠키가 포함 된 요청은 여전히 ​​전송되지 않은 요청에 대해 전송되었습니다. 따라서 CSRF는 여전히 수행됩니다.
Pacerier

7
이것은 널리 사용되는 답변이므로 요청과 응답 헤더를 올바르게 구성하는 것 외에도 브라우저가 타사 쿠키를 차단하지 않는지 확인해야합니다. 교차 출처 자격 증명 요청이 작동하기를 원합니다. 참조 stackoverflow.com/a/16634887/2970321을
alexw

5
이것은 처음으로 읽는 사람이 쿠키와 잘 작동하지 않는 것처럼 보이는 코드를 이해하고 수정할 수 있다는 분명한 대답입니다. 감사!
ass
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.