쿠키로 API 가져 오기


201

새 Fetch API를 사용하려고하는데 쿠키에 문제가 있습니다. 특히 로그인에 성공하면 이후 요청에 쿠키 헤더가 있지만 Fetch는 해당 헤더를 무시하는 것으로 보이며 Fetch로 작성된 모든 요청은 권한이 없습니다.

Fetch가 아직 준비되지 않았거나 Fetch가 쿠키와 작동하지 않기 때문입니까?

Webpack으로 앱을 빌드합니다. 또한 React Native에서 Fetch를 사용하는데 같은 문제가 없습니다.

답변:


280

가져 오기는 기본적으로 쿠키를 사용하지 않습니다. 쿠키를 활성화하려면 다음과 같이하십시오 :

fetch(url, {
  credentials: "same-origin"
}).then(...).catch(...);

55
same-origin은 더 이상 작동하지 않습니다. include (Jerry 's answer 참조) : developers.google.com/web/updates/2015/03/introduction-to-fetch
jpic

7
@jpic : 'include'는 출처 간 요청에만 작동하지만 출처는 동일하지 않습니다. 공식 문서 : github.com/github/fetch#sending-cookies
HoldOffHunger

js에서 fetch로 읽을 수있는 경우 httponly 쿠키를 갖는 이유는 무엇입니까?
Martin Bajcar

4
저는 믿습니다 same-origin(어느 않습니다 더 헤더 (쿠키 등)을 존중하지만 코드가 응답에 대한 액세스가 제한됩니다 여전히 작업)을 의미합니다.
Coderer

2
트윗 담아 가기 나중에 이해할 수 있듯이 httponly 쿠키를 사용한다는 것은 쿠키를 읽을 수 document.cookie없지만 여전히 ajax 또는 페치 요청에 사용할 수 있음을 의미합니다.
Martin Bajcar

186

교차 출처 요청을하는 사람들을위한 @Khanetor의 답변 외에도 : credentials: 'include'

샘플 JSON 페치 요청 :

fetch(url, {
  method: 'GET',
  credentials: 'include'
})
  .then((response) => response.json())
  .then((json) => {
    console.log('Gotcha');
  }).catch((err) => {
    console.log(err);
});

https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials


9
쿠키는 어떻게 설정합니까?
pomo

2
쿠키는 서버 측에서 설정됩니다. 제 경우에는 httponly 쿠키를 사용하고있었습니다.
Khanetor

3
@Khanetor javascript로 document.cookie를 사용하여 쿠키를 설정 한 다음 요청을 보낼 수 있습니까?
ospider 2016 년

@ospider 헤더로 보낼 수 있습니다.
10101010

2
@ospider 나는 값을 설정하는 document.cookie것이 요청에 포함되기에 충분 하다는 것을 알았습니다 .
skwidbreth

36

방금 해결했습니다. 그냥 두 f. 잔인한 날

나를 위해 비밀은 다음과 같습니다.

  1. POST / api / auth에 전화를 걸어 쿠키가 성공적으로 수신되었음을 확인했습니다.

  2. 그런 다음 credentials: 'include'요청과 함께 쿠키가 전송되지 않았으므로 GET / api / users /를 호출 하고 401 인증을받지 못했습니다.

KEY는 credentials: 'include'첫 번째 /api/auth통화에도 설정됩니다.


1
정확히 당신의 문제가 있습니다. 세션 쿠키는 GET 데이터 요청시 전송되지 않습니다. 그래서 401. 나는 Axios와 Fetch를 시도했다. 같은 결과. 2 가지 가능성 : 로그인 POST가 수신 된 쿠키를 저장하지 않거나 다음 GET 데이터가 저장된 쿠키를 전송하지 않습니다
Rhubarb65

@ Rhubarb65,이 U을 승리하려면 credentials: 'include'먼저 지정해야합니다POST /api/auth
user1671599

예, 나는 그것을 가지고 있지만 충분합니다. 나는 devserver 프록시 (클라이언트 HTTP) 사용
Rhubarb65

예, 자격 증명이 있지만 충분하지 않습니다. CORS : (client http)-proxy-(server https)를 지나기 위해 devserver 프록시를 사용하고있었습니다. 보안 쿠키에는 https가 필요하기 때문에 서버의 sessionid 쿠키가 브라우저에 설정되어 있지 않다고 생각합니다. 따라서 devserver 프록시에서 https : true 플래그를 추가하여 수정했습니다.
Rhubarb65

1
잘 건배. 당신의 대답은 하루만의 무차별 대치가 필요하다는 것을 의미했습니다. :)
Michael

16

2019 년에이 내용을 읽는 경우 credentials: "same-origin"기본값입니다.

fetch(url).then

1
그러나 모든 사람이 충분히 업데이트 된 브라우저를 사용하고있는 것은 아닙니다. 내 자신의 Firefox 버전 (60.x, 데비안 스트레치에서 가장 최신 버전)이 기본적으로 설정하지 않기 때문에이 질문을 보았습니다.
philh

2

.net webapi2사용자를 위해 여기에 정답을 추가하십시오 .

cors클라이언트 사이트가 다른 주소에서 제공되기 때문에 사용 하는 경우 서버 측 구성 webapi에도 포함해야 SupportsCredentials=true합니다.

        // Access-Control-Allow-Origin
        // https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
        var cors = new EnableCorsAttribute(Settings.CORSSites,"*", "*");
        cors.SupportsCredentials = true;
        config.EnableCors(cors);

0

이것은 나를 위해 작동합니다 :

import Cookies from 'universal-cookie';
const cookies = new Cookies();

function headers(set_cookie=false) {
  let headers = {
    'Accept':       'application/json',
    'Content-Type': 'application/json',
    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
};
if (set_cookie) {
    headers['Authorization'] = "Bearer " + cookies.get('remember_user_token');
}
return headers;
}

그런 다음 전화를하십시오.

export function fetchTests(user_id) {
  return function (dispatch) {
   let data = {
    method:      'POST',
    credentials: 'same-origin',
    mode:        'same-origin',
    body:        JSON.stringify({
                     user_id: user_id
                }),
    headers:     headers(true)
   };
   return fetch('/api/v1/tests/listing/', data)
      .then(response => response.json())
      .then(json => dispatch(receiveTests(json)));
    };
  }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.