programing

Angularjs $http가 응답에서 "Set-Cookie"를 이해하지 못하는 것 같습니다.

goodsources 2023. 9. 18. 21:19
반응형

Angularjs $http가 응답에서 "Set-Cookie"를 이해하지 못하는 것 같습니다.

인증을 위해 여권 모듈이 있는 nodejs express REST api를 가지고 있습니다.GET(Login Method)는 헤더에 쿠키를 반환합니다.Chrome에서 호출하면 잘 작동하고, 브라우저에 쿠키가 설정되어 있습니다.

하지만 Angularjs에서 $http로 호출하면 쿠키가 설정되어 있지 않습니다.

Set-Cookie:connect.sid=s%3Ad7cZf3DSnz-IbLA_eNjQr-YR.R%2FytSJyd9cEhX%2BTBkmAQ6WFcEHAuPJjdXk3oq3YyFfI; Path=/; HttpOnly

위에서 볼 수 있듯이 세트-쿠키는 http 서비스 응답의 헤더에 존재합니다.

HttpOnly가 이 문제의 원인일 수도 있습니까?만약 그렇다면 어떻게 변경할 수 있습니까?다음은 제 급행 구성입니다.

app.configure(function () {
    app.use(allowCrossDomain);
    app.use(express.bodyParser());
    app.use(express.cookieParser())
    app.use(express.session({ secret: 'this is a secret' }));
    app.use(flash());
    //passport init
    app.use(passport.initialize());
    app.use(passport.session());
    app.set('port', process.env.PORT || 8080);
});

도와주셔서 고맙습니다.

자격 증명을 사용하도록 $http 요청을 구성해야 합니다.XHR 설명서에서:

https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

XMLHttpRequest와 Access Control 모두에 의해 노출되는 가장 흥미로운 기능은 HTTP Cookies와 HTTP Authentication 정보를 인식하는 "인증된" 요청을 수행하는 기능입니다.기본적으로 교차 사이트 XMLHtpRequest 호출에서는 브라우저가 자격 증명을 전송하지 않습니다.XMLHttpRequest 개체를 호출할 때 특정 플래그를 설정해야 합니다.

옵션 개체를 사용하여 자격 증명 사용을 설정할 수 있습니다.

http://docs.angularjs.org/api/ng.$http

예:

$http({withCredentials: true, ...}).get(...)

쿠키의 존재 여부는 어떻게 확인하고 있습니까?

$http는다일이죠 . jQuery럼의j죠ejuestatd의r'ru에의xsy다rxs는일,'$.ajax친구들도 있고요.이는 브라우저가 쿠키를 정상적으로 처리한다는 것을 의미합니다.

생각에는 쿠키가 세팅되고 있는 것 같은데, 당신은 그것을 끝까지 읽으려고 하는 겁니다.document.cookie.HttpOnly는 스크립트가 쿠키에 액세스할 수 없도록 합니다.이것은 좋은 일입니다.

HttpOnly는 XSS 공격을 완화하는 데 도움이 됩니다.악의적인 스크립트가 사용자의 세션 토큰(및 로그인)을 훔치는 것을 불가능하게 합니다.끄지 마십시오.

어쨌든 쿠키가 필요하지는 않을 겁니다.$http는 XHR 주변의 포장지일 뿐이며, 브라우저는 다음에 요청할 때 자동으로 쿠키를 전송합니다.Developer Tools의 Network 패널에서 요청을 보고 확인할 수 있습니다.

는 를 하였습니다를 하였습니다.{withCredential : true}$http 및 :및별청:

res.header("Access-Control-Allow-Credentials", true);

내 고속 서버 구성에서.이렇게 하면 브라우저 쿠키 목록에 쿠키가 잘 나타납니다.

아래 솔루션이 효과가 있었습니다.

Angular에서 나는 다음과 같은 코드 스니펫을 사용했습니다.withCredentials: true부탁이 있어서요

this._http.post(this._apiUrl + 'api/' + url, data, { withCredentials: true })
            .subscribe(data => { resolve(data) }, error => { this.showServerError(error)})

노드에서, 해결책을 얻기 전에, 저는 단지 CORS를 초기화하고 있었습니다.

app.use(cors());

하지만 지금은 다음과 같은 코드 스니펫을 구현했습니다.

app.use(cors({origin: [
   "http://localhost:5000"
 ], credentials: true}))

여기서 http://localhost:5000은 내 Angular 애플리케이션 끝점입니다.이 URL은 config 또는 .env 파일에서 동적으로 설정할 수 있습니다.

위의 해결책이 당신의 문제에 효과가 있기를 바랍니다.

를 구성하여 변경할 수 있습니다.express.session:

app.use(express.session({
  secret : 'this is a secret',
  cookie : {
    httpOnly : false,
    maxAge   : XXX // see text
  }
});

하지만 Angular는 쿠키에 대해 별로 신경쓰지 않는 것 같습니다. 쿠키는 브라우저에서 처리합니다(그리고 @josh3736님이 보관해야 하는 것에 동의합니다).httpOnly로.true).

쿠키가 (브라우저-) 세션 쿠키인 것과 관련이 있을 수 있습니다.명시적으로 설정하면 더 잘 작동하는지 확인할 수 있습니다.maxAge쿠키의 경우(밀리초 단위).

언급URL : https://stackoverflow.com/questions/19383311/angularjs-http-does-not-seem-to-understand-set-cookie-in-the-response

반응형