CORS : 자격 증명 모드는 '포함'입니다.


101

네, 당신이 무슨 생각을하는지 알고 있습니다. 또 다른 CORS 질문이지만 이번에는 난처합니다.

따라서 시작하려면 실제 오류 메시지 :

XMLHttpRequest는 http : //localhost/Foo.API/token을 로드 할 수 없습니다 . 요청의 자격 증명 모드가 'include'인 경우 응답의 'Access-Control-Allow-Origin'헤더 값은 와일드 카드 '*'가 아니어야합니다 . 따라서 원본 ' http : // localhost : 5000 '은 액세스가 허용되지 않습니다. XMLHttpRequest에 의해 시작된 요청의 자격 증명 모드는 withCredentials 속성에 의해 제어됩니다.

자격 증명 모드의 의미 가 '포함' 인지 잘 모르겠습니다 .

따라서 우편 배달부에서 요청을 수행 할 때 이러한 오류가 발생 하지 않습니다 .

여기에 이미지 설명 입력

그러나 angularjs 웹 앱을 통해 동일한 요청에 액세스 할 때이 오류로 인해 당황합니다. 여기 내 angualrjs 요청 / 응답이 있습니다. 보시다시피 응답은 OK 200이지만 여전히 CORS 오류가 발생합니다.

Fiddler 요청 및 응답 :

다음 이미지는 웹 프런트 엔드에서 API 로의 요청 및 응답을 보여줍니다.

바이올리니스트

그래서 내가 온라인에서 읽은 다른 모든 게시물을 보면 내가 옳은 일을하고있는 같아서 오류를 이해할 수 없습니다. 마지막으로 angualrjs (로그인 팩토리)에서 사용하는 코드는 다음과 같습니다.

여기에 이미지 설명 입력

API의 CORS 구현-참조 목적 :

사용 된 방법 1 :

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*", "*")
        {
            SupportsCredentials = true
        };
        config.EnableCors(cors);
    }
}

사용 된 방법 2 :

public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);

}

미리 감사드립니다!


멋진 사진은 무엇입니까? 당신이 인증을 포함하는 경우, 액세스 제어 - 허용 - 기원 응답이 질문에 대답하기 위해 있어야합니다 원래 (브라우저 페이지) 호스트 수, 그것은 할 수 있을 *때문에, 서버 측 잘못 CORS를하고있다 - - 아, 그리고 우체부 작동하기 때문에 그것은 십자가의 기원 요청이 아니에요
Jaromanda X에게

@JaromandaX, 응답 주셔서 감사합니다. 그림은 요청 / 응답을 보여주고 전달되는 헤더를 보여줍니다. 당신은 분명히 그것의 목표 ... 수행하지 않았다고 주장, 질문을
리처드 베일리

사진을 볼 필요가 없었다 - 내 의견은 당신이 알아야 할 모든해야
Jaromanda X에게

그래서 최근에 나는 웹 API의 쿠키에서 벗어나 토큰을 사용하기로 결정했습니다. 쿠키를 사용할 때 CORS는 문제없이 작동합니다. 나는 서버 측에서 제대로 구현되지 않은 방법 CORS 이해하기 위해 사투를 벌인거야 그래서
리처드 베일리

1
당신이 인증을 포함하면 access-control-allow-origin응답이 원래 (브라우저 페이지) 호스트해야합니다, 그것은 될 수 없습니다*
Jaromanda X

답변:


104

문제는 Angular 코드에서 비롯됩니다.

withCredentialstrue로 설정 되면 요청과 함께 자격 증명 또는 쿠키를 보내려고합니다. 다른 오리진이 잠재적으로 인증 된 요청을 시도하고 있음을 의미하므로 와일드 카드 ( "*")는 "Access-Control-Allow-Origin"헤더로 허용되지 않습니다.

이 작업을 수행하려면 "Access-Control-Allow-Origin"헤더에서 요청을 만든 출처로 명시 적으로 응답해야합니다.

요청의 출처로 간단히 응답하면 사용자가 유효한 세션을 갖게되면 지정된 웹 사이트에서 백엔드에 인증 된 호출을 할 수 있기 때문에 인증 된 요청을 허용하려는 출처를 명시 적으로 허용 목록에 추가하는 것이 좋습니다.

나는 내가 오래전에 쓴 이 기사 에서 이것을 설명한다 .

따라서 withCredentialsfalse로 설정 하거나 원본 허용 목록을 구현하고 자격 증명이 관련 될 때마다 유효한 원본으로 CORS 요청에 응답 할 수 있습니다.


4
TypeScript로 Angular 5 응용 프로그램을 작업 중입니다. withCredentials를 true로 제공해야합니다. 그렇지 않으면 Authorization Failed 예외가 발생합니다. 이 문제를 해결하는 방법 Credentials : true
Ziggler

@Ziggler 나도 같은 상황을 겪었습니다. 해결책을 찾으셨습니까?
Pavel

@Ziggler 나는 해결책을 내 대답을 참조하십시오.
Pavel

1
WithCredentials = TRUE 및 Access-Control-Allow-Origin = [ ' localhost : 4200']을 사용할 때 여전히이 오류가 발생 하고 별 *를 사용하지 않으므로 오류 메시지가 더 이상 의미가 없습니다. 오류 메시지 : "프리 플라이트 요청에 대한 응답이 액세스 제어 검사를 통과하지 못함 : 요청의 자격 증명 모드가 '포함'인 경우 응답의 'Access-Control-Allow-Origin'헤더 값이 와일드 카드 *가 아니어야합니다. 따라서 ' localhost : 4200 '은 액세스가 허용되지 않습니다. XMLHttpRequest에 의해 시작된 요청의 자격 증명 모드는 withCredentials 속성에 의해 제어됩니다. "
mruanova

@mruanova Access-Control-Allow-Origin 헤더가 요청에 올바르게 설정되어 있습니까? 뭔가 와일드 카드 어딘가로 보내지는 것 같은데
geekonaut

14

CORS 미들웨어를 사용 중이고 withCredentials부울 true 를 전송 하려면 다음과 같이 CORS를 구성 할 수 있습니다.

var cors = require('cors');    
app.use(cors({credentials: true, origin: 'http://localhost:5000'}));

`


11

Angular 5 및 Spring Security를위한 CORS 커스터마이징 (쿠키 기반 솔루션)

Angular 측 withCredentials: true에서 쿠키 전송을위한 옵션 플래그 를 추가해야합니다 .

constructor(public http: HttpClient) {
}

public get(url: string = ''): Observable<any> {
    return this.http.get(url, { withCredentials: true });
}

Java 서버 측 CorsConfigurationSource에서 구성 CORS 정책에 필요한 추가 :

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        // This Origin header you can see that in Network tab
        configuration.setAllowedOrigins(Arrays.asList("http:/url_1", "http:/url_2")); 
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        configuration.setAllowedHeaders(Arrays.asList("content-type"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and()...
    }
}

configure(HttpSecurity http)기본적으로 방법 corsConfigurationSourcehttp.cors()


1

도움이된다면 reactjs 앱과 함께 centrifuge를 사용하고 있었고, 아래 댓글을 확인한 후 centrifuge.js 라이브러리 파일을 살펴 보았습니다.이 파일은 제 버전에 다음 코드 스 니펫이 있습니다.

if ('withCredentials' in xhr) {
 xhr.withCredentials = true;
}

이 세 줄을 제거한 후 앱이 예상대로 제대로 작동했습니다.

도움이 되었기를 바랍니다.


1

.NET Core를 사용하는 경우 Startup.CS에서 CORS를 구성 할 때 .AllowCredentials ()가 필요합니다.

ConfigureServices 내부

services.AddCors(o => {
    o.AddPolicy("AllowSetOrigins", options =>
    {
        options.WithOrigins("https://localhost:xxxx");
        options.AllowAnyHeader();
        options.AllowAnyMethod();
        options.AllowCredentials();
    });
});

services.AddMvc();

그런 다음 구성 내부 :

app.UseCors("AllowSetOrigins");
app.UseMvc(routes =>
    {
        // Routing code here
    });

저에게는 특별히 언급 한 오류를 일으킨 options.AllowCredentials ()가 누락되었습니다. CORS 문제가있는 다른 사람들에게도 일반적으로 부수적으로, 순서 문제와 AddCors ()는 Startup 클래스 내에서 AddMVC () 전에 등록되어야합니다.


0

클라이언트 측에서 Axios.defaults.withCredentials=true( {credentials: true}) 대신 추가 하고 다음 app.use(cors())으로 변경하십시오 .

app.use(cors(
  {origin: ['your client side server'],
  methods: ['GET', 'POST'],
  credentials:true,
}
))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.