사용자 정의 헤더를 사용하여 한 도메인에서 다른 도메인으로 리디렉션 또는 HTTP 프로토콜 제한으로 인해 응답에 쿠키를 설정할 수 없습니다. 리디렉션은 기본적으로 응답과 관련된 헤더(위치)로 구성되며 대상 위치에 헤더를 추가하는 것을 허용하지 않습니다.
다른 도메인에 대한 쿠키 설정도 허용되지 않습니다. 심각한 보안 위험을 초래합니다. 브라우저는 Set-Cookie 헤더를 사용하여 응답과 함께 서버에서 보낸 쿠키를 저장하고 나중에 동일한 도메인 내의 동일한 서버에 대한 요청에 대해 서버로 다시 보냅니다. 쿠키는 다른 도메인으로 전송되지 않습니다.
한 가지 접근 방식은 소스 도메인이 다음을 사용하여 사용자를 대상 도메인으로 리디렉션하도록 하는 것입니다. 쿼리 매개변수로 전달된 액세스 토큰입니다. 그런 다음 대상 도메인은 토큰을 읽고 브라우저가 후속 요청을 위해 이를 저장하고 전송하는 자체 쿠키를 설정할 수 있습니다.
소스 도메인(appA.py)
<code class="python">from fastapi import FastAPI, Response from fastapi.responses import RedirectResponse, HTMLResponse app = FastAPI() @app.get('/', response_class=HTMLResponse) def home(): return ''' <!DOCTYPE html> <html> <body> <h2>Click the "submit" button to be redirected to domain B</h2> <form method="POST" action="/submit"> <input type="submit" value="Submit"> </form> </body> </html> ''' @app.post('/submit') def submit(): token = 'MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3' redirect_url = f'http://example.test:8001/submit?token={token}' response = RedirectResponse(redirect_url) response.set_cookie(key='access-token', value=token, httponly=True) return response</code>
대상 도메인(appB.py)
<code class="python">from fastapi import FastAPI, Request, status from fastapi.responses import RedirectResponse, HTMLResponse app = FastAPI() @app.get('/', response_class=HTMLResponse) def home(): token = request.cookies.get('access-token') print(token) return 'You have been successfully redirected to domain B!' \ f' Your access token ends with: {token[-4:]}' @app.post('/submit') def submit(request: Request, token: str): redirect_url = request.url_for('home') response = RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER) response.set_cookie(key='access-token', value=token, httponly=True) return response</code>
또 다른 접근 방식은 Window를 사용하는 것입니다. 교차 출처 통신을 위한 postMessage(). 소스 도메인은 토큰을 대상 도메인으로 보내고, 대상 도메인은 토큰을 localStorage에 저장하고 쿠키를 설정합니다. 단점은 브라우저 호환성과 localStorage의 민감한 데이터 저장입니다.
StackExchange는 서로 다른 사이트 간의 자동 로그인을 위해 보다 강력한 솔루션을 사용합니다. 여기에는 서버 응답을 트리거하고 대상 사이트에 쿠키를 설정하는 이미지의 src 속성을 통해 인증 토큰을 보내는 작업이 포함됩니다.
이를 위해서는 브라우저에서 타사 쿠키를 승인하고 대상 서버에서 CORS 구성을 구성해야 합니다. 또한 쿼리 문자열에 토큰을 보내 잠재적인 보안 위험을 초래합니다.
소스 도메인(appA.py)
<code class="python">from fastapi import FastAPI, Response from fastapi.responses import HTMLResponse app = FastAPI() @app.get('/', response_class=HTMLResponse) def home(): return ''' <!DOCTYPE html> <html> <body> <h2>Click the "submit" button to be redirected to domain B</h2> <input type="button" value="Submit" onclick="submit()"> <script> function submit() { fetch('/submit', { method: 'POST', }) .then(res => { authHeader = res.headers.get('Authorization'); if (authHeader.startsWith("Bearer ")) token = authHeader.substring(7, authHeader.length); return res.text(); }) .then(data => { var url = 'http://example.test:8001/submit?token=' + encodeURIComponent(token); var img = document.createElement('img'); img.style = 'display:none'; img.crossOrigin = 'use-credentials'; img.onerror = function(){ window.location.href = 'http://example.test:8001/'; } img.src = url; }) .catch(error => { console.error(error); }); } </script> </body> </html> ''' @app.post('/submit') def submit(): token = 'MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3' headers = {'Authorization': f'Bearer {token}'} response = Response('success', headers=headers) response.set_cookie(key='access-token', value=token, httponly=True) return response</code>
대상 도메인(appB) .py)
<code class="python">from fastapi import FastAPI, Request, Response from fastapi.responses import RedirectResponse from fastapi.middleware.cors import CORSMiddleware app = FastAPI() origins = ['http://localhost:8000', 'http://127.0.0.1:8000', 'https://localhost:8000', 'https://127.0.0.1:8000'] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.get('/') def home(request: Request): token = request.cookies.get('access-token') print(token) return 'You have been successfully redirected to domain B!' \ f' Your access token ends with: {token[-4:]}' @app.get('/submit') def submit(request: Request, token: str): response = Response('success') response.set_cookie(key='access-token', value=token, samesite='none', secure=True, httponly=True) return response</code>
도메인 간에 토큰을 전송하거나 쿠키를 설정할 때 보안에 미치는 영향을 고려하는 것이 중요합니다. 중요한 데이터는 가로채거나 손상될 수 있으므로 쿼리 문자열에 포함하여 전송하지 마세요. 안전한 데이터 전송을 위해 HTTPS 연결을 사용하십시오. 사이트 간 액세스 보호를 위해 Secure 플래그를 사용하여 SameSite 플래그를 '없음'으로 설정하세요.
위 내용은 HTTP에서 도메인 간 쿠키와 헤더를 사용하여 리디렉션하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!