>  기사  >  백엔드 개발  >  HTTP에서 도메인 간 쿠키와 헤더를 사용하여 리디렉션하는 방법은 무엇입니까?

HTTP에서 도메인 간 쿠키와 헤더를 사용하여 리디렉션하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-02 18:30:02408검색

How to Redirect with Cookies and Headers Between Domains in HTTP?

한 도메인에서 다른 도메인으로 리디렉션 및 다른 도메인에 쿠키 또는 헤더 설정

도전

사용자 정의 헤더를 사용하여 한 도메인에서 다른 도메인으로 리디렉션 또는 HTTP 프로토콜 제한으로 인해 응답에 쿠키를 설정할 수 없습니다. 리디렉션은 기본적으로 응답과 관련된 헤더(위치)로 구성되며 대상 위치에 헤더를 추가하는 것을 허용하지 않습니다.

다른 도메인에 대한 쿠키 설정도 허용되지 않습니다. 심각한 보안 위험을 초래합니다. 브라우저는 Set-Cookie 헤더를 사용하여 응답과 함께 서버에서 보낸 쿠키를 저장하고 나중에 동일한 도메인 내의 동일한 서버에 대한 요청에 대해 서버로 다시 보냅니다. 쿠키는 다른 도메인으로 전송되지 않습니다.

해결책 1: 대상 도메인의 쿼리 매개변수 및 쿠키 설정을 사용하여 리디렉션

한 가지 접근 방식은 소스 도메인이 다음을 사용하여 사용자를 대상 도메인으로 리디렉션하도록 하는 것입니다. 쿼리 매개변수로 전달된 액세스 토큰입니다. 그런 다음 대상 도메인은 토큰을 읽고 브라우저가 후속 요청을 위해 이를 저장하고 전송하는 자체 쿠키를 설정할 수 있습니다.

소스 도메인(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>

해결책 2: Window.postMessage()를 사용한 Cross-Origin 통신

또 다른 접근 방식은 Window를 사용하는 것입니다. 교차 출처 통신을 위한 postMessage(). 소스 도메인은 토큰을 대상 도메인으로 보내고, 대상 도메인은 토큰을 localStorage에 저장하고 쿠키를 설정합니다. 단점은 브라우저 호환성과 localStorage의 민감한 데이터 저장입니다.

해결책 3: StackExchange 범용 로그인 접근 방식

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(&quot;Bearer &quot;))
                        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=[&quot;*&quot;],
    allow_headers=[&quot;*&quot;],
)

@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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.