>  기사  >  백엔드 개발  >  도메인 간을 리디렉션하고 쿠키 또는 헤더를 설정하는 방법은 무엇입니까?

도메인 간을 리디렉션하고 쿠키 또는 헤더를 설정하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-31 05:30:01309검색

How to Redirect Between Domains and Set Cookies or Headers?

한 도메인에서 다른 도메인으로 리디렉션하고 다른 도메인에 쿠키 또는 헤더를 설정하는 방법은 무엇입니까?

여기에 설명된 대로 사용자 정의 헤더가 설정된 다른 도메인으로 리디렉션할 수 없습니다. 어떤 언어나 프레임워크를 사용하든 상관없습니다. HTTP 프로토콜의 리디렉션은 기본적으로 응답과 관련된 헤더(즉, 위치)이며 대상 위치에 추가되는 헤더를 허용하지 않습니다. 예제에 Authorization 헤더를 추가하면 기본적으로 리디렉션 자체가 아니라 브라우저에 리디렉션을 지시하는 응답에 해당 헤더를 설정하게 됩니다. 즉, 해당 헤더를 클라이언트에게 다시 보내는 것입니다.

HTTP 쿠키의 경우 브라우저는 서버에서 보낸 쿠키를 응답과 함께 저장합니다(Set-Cookie 사용). 헤더), 나중에 쿠키 HTTP 헤더 내에서 동일한 서버에 대한 요청과 함께 쿠키를 보냅니다. 문서에 따르면:

Set-Cookie HTTP 응답 헤더는
서버에서 사용자 에이전트로 쿠키를 보내는 데 사용됩니다. 따라서 사용자 에이전트는 쿠키를 다시
서버로 보낼 수 있습니다. 나중에. 여러 쿠키를 보내려면 여러 Set-Cookie
헤더를 동일한 응답으로 전송해야 합니다.

따라서 이것이 하나의 앱(하위 도메인, 예: abc.example.test 포함)에서 리디렉션된 경우 )를 동일한(상위) 도메인을 갖고 있고 쿠키를 생성할 때 도메인 플래그가 example.test로 설정된 다른 도메인(하위 도메인(예: xyz.example.test) 포함)으로 쿠키를 공유하면 쿠키가 성공적으로 공유됩니다. 두 개의 앱(도메인이 지정된 것처럼 하위 도메인이 항상 포함됨) 브라우저는 어떤 프로토콜(HTTP/HTTPS)이나 포트가 사용되는지에 관계없이 모든 하위 도메인을 포함하여 특정 도메인에서 쿠키를 사용할 수 있도록 합니다. 도메인 및 경로 플래그를 사용하여 쿠키의 가용성을 제한할 수 있을 뿐만 아니라 보안 및 httpOnly 플래그를 사용하여 쿠키에 대한 액세스를 제한할 수 있습니다(여기 및 여기와 Starlette 설명서 참조). httpOnly 플래그가 설정되지 않으면 잠재적인 공격자가 JavaScript(JS)를 통해 정보를 읽고 수정할 수 있는 반면, httpOnly 속성이 있는 쿠키는 서버로만 전송되며 클라이언트 측에서는 JS에 액세스할 수 없습니다.

그러나 다른 도메인에는 쿠키를 설정할 수 없습니다. 이것이 허용된다면 엄청난 보안 결함이 발생할 것입니다. 따라서 "일부 쿠키 세트...*""를 사용하여 한 응용 프로그램(도메인)에서 다른 응용 프로그램(도메인)으로 사용자를 리디렉션하려고 하므로 쿠키가 전송되기만 하므로 작동하지 않습니다. 동일 도메인에 대한 요청.

해결책 1

여기에 설명된 솔루션은 URL에 쿼리 매개변수로 전달된 액세스 토큰을 사용하여 도메인(앱) A가 사용자를 도메인(앱) B로 리디렉션하도록 하는 것입니다. 그런 다음 도메인 B는 토큰을 읽고 자체 쿠키를 설정하므로 브라우저는 이후 도메인 B에 대한 모든 요청과 함께 해당 쿠키를 저장하고 보냅니다.

보안(HTTPS) 통신 사용을 고려해야 합니다. , 토큰이 암호화되어 전송되도록 하고 쿠키를 생성할 때 보안 플래그를 설정합니다. 또한 쿼리 문자열에 토큰이 있으면 심각한 보안 위험이 발생합니다. 민감한 데이터는 쿼리 문자열에 전달되어서는 안 되기 때문입니다. 이는 URL의 일부인 쿼리 문자열이 브라우저의 주소 표시줄에 나타나기 때문입니다. 따라서 사용자는 토큰이 포함된 URL을 보고 북마크에 추가할 수 있습니다(디스크에 저장된다는 의미). 또한 URL은 검색 기록에 기록됩니다. 즉, URL은 어쨌든 디스크에 기록되고 기록 탭에 표시됩니다(브라우저 기록을 보려면 Ctrl H를 누르세요). 위의 두 가지 방법 모두 공격자(및 컴퓨터/모바일 장치를 공유하는 사람들)가 이러한 민감한 데이터를 훔칠 수 있도록 허용합니다. 또한 많은 브라우저 플러그인/확장 프로그램은 사용자의 탐색 활동을 추적합니다. 악성 웹사이트를 감지하고 사전에 경고하기 위해 귀하가 방문하는 모든 URL이 분석을 위해 해당 서버로 전송됩니다. 따라서 아래 접근 방식을 사용하기 전에 위의 모든 사항을 고려해야 합니다(이 주제에 대한 관련 게시물은 여기, 여기 및 여기를 참조하세요).

주소 표시줄에 URL이 표시되는 것을 방지하려면 아래 접근 방식을 따르세요. 도메인 B 내에서도 리디렉션을 사용합니다. 도메인 B가 토큰을 쿼리 매개변수로 사용하여 /submit 경로에 대한 요청을 받으면 도메인 B는 토큰이 없는 기본 URL(예: 홈 페이지)로 리디렉션하여 응답합니다. 이러한 리디렉션으로 인해 토큰이 포함된 URL은 검색 기록에 남지 않습니다. 이는 앞서 설명한 특정 공격에 대해 어느 정도 보호 기능을 제공하지만 브라우저 확장 프로그램 등이 여전히 토큰이 포함된 URL을 캡처할 수 없다는 의미는 아닙니다.

이를 테스트하는 경우 localhost에서는 애플리케이션 B에 다른 도메인 이름을 제공해야 합니다. 그렇지 않으면 앞서 언급한 것처럼 동일한 도메인을 가진 응용 프로그램 간에 쿠키가 공유되므로 결국 도메인 A에 대해 설정된 쿠키를 받게 되며 이 접근 방식이 전혀 작동하는지 알 수 없습니다. 그렇게 하려면 /etc/hosts 파일(Windows의 경우 C:WindowsSystem32driversetc에 있음)을 편집하고 호스트 이름을 127.0.0.1에 할당해야 합니다. 예:

127.0.0.1 example.test

도메인에 구성표나 포트를 추가해서는 안 되며, .com, .net 등과 같은 일반적인 확장자를 사용해서도 안 됩니다. 그렇지 않으면 충돌이 발생할 수 있습니다. 인터넷상의 다른 웹사이트에 접속하여.

아래 도메인 A에 액세스하면 제출 버튼을 클릭하여 /submit 경로에 대한 POST 요청을 수행하여 리디렉션을 시작해야 합니다. POST 요청의 유일한 이유는 예제에서 이를 사용하고 있기 때문이며 일부 양식 데이터를 게시해야 한다고 가정합니다. 그렇지 않으면 GET 요청도 사용할 수 있습니다. 앱 B에서 POST 경로(예: /submit)에서 GET 경로(예: /)로 RedirectResponse를 수행하면 여기, 여기 및 여기에 설명된 대로 응답 상태 코드가 status.HTTP_303_SEE_OTHER로 변경됩니다. 앱 A는 포트 8000에서 수신 대기하고 있고 앱 B는 포트 8001에서 수신 대기 중입니다.

아래 두 앱을 모두 실행한 다음 http://127.0.0.1:8000/에서 도메인 A에 액세스합니다.

appA.py

127.0.0.1 example.test

appB.py

<code class="python">from fastapi import FastAPI, FastAPI
from fastapi.responses import RedirectResponse, HTMLResponse
import uvicorn

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)  # set cookie for domain A too
    return response
 
if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)</code>

해결책 2

또 다른 해결책은 Window 개체 간의 출처 간 통신을 가능하게 하는 Window.postMessage()를 사용하는 것입니다. 예를 들어, 페이지와 페이지가 생성한 팝업 사이, 또는 페이지와 페이지에 포함된 iframe 사이에 있습니다. 이벤트 리스너를 추가하고 창 간에 통신하는 방법에 대한 예는 여기에서 찾을 수 있습니다. 따라야 할 단계는 다음과 같습니다.

1단계: 도메인 A에 숨겨진 iframe을 도메인 B에 추가합니다. 예:

<code class="python">from fastapi import FastAPI, Request, status
from fastapi.responses import RedirectResponse
import uvicorn

app = FastAPI()

@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.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
 
if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8001)</code>

2단계 :

에서 인증 토큰을 받는 즉시

위 내용은 도메인 간을 리디렉션하고 쿠키 또는 헤더를 설정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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