codememo

플라스크 앱에서 다른 사이트로 GET 요청을 보내려면 어떻게 해야 하나요?

tipmemo 2023. 2. 12. 17:55
반응형

플라스크 앱에서 다른 사이트로 GET 요청을 보내려면 어떻게 해야 하나요?

원래 클라이언트 측에서 서드파티 URL에 Ajax 요청을 올리려고 했는데 브라우저에 보안 문제가 있는 것 같습니다.서버 측에 Ajax를 송신해, 거기서 GET 요구를 서드파티에 송신해, 응답을 취득해 클라이언트 측에 반송하는 것을 검토했습니다.플라스크로 어떻게 해요?

설치합니다.requests모듈을 사용하는 보다 더 )urllib2그런 다음 필요한 요구를 하는 루트를 정의합니다.하다

import requests
from flask import Flask
app = Flask(__name__)

@app.route('/some-url')
def get_data():
    return requests.get('http://example.com').content

그러나 설정에 따라서는 특정 URL에서 대상 사이트로 역프록시를 하도록 웹 서버를 구성하는 것이 좋습니다.

Flask만으로는 이 기능이 없지만 HTTP 클라이언트라이브러리를 사용하여 다른 서버에 요청을 하는 요청 핸들러를 작성한 후 해당 응답을 반환하는 것은 간단한 문제입니다.

# third-party HTTP client library
import requests

# assume that "app" below is your flask app, and that
# "Response" is imported from flask.

@app.route("/proxy-example")
def proxy_example():
    r = requests.get("http://example.com/other-endpoint")
    return Response(
        r.text,
        status=r.status_code,
        content_type=r.headers['content-type'],
    )

단, 클라이언트 측 요구와 완전히 같은 결과를 얻을 수는 없습니다.서버는 클라이언트브라우저가 타겟사이트용으로 저장한 쿠키를 "확인"할 수 없기 때문에 프록시된 요청은 사실상 익명입니다.따라서 타겟사이트에 따라서는 브라우저로 자원을 요구하는 경우와 다른 응답을 얻을 수 있습니다.

서드파티제의 URL과의 관계(즉, 서드파티제의 URL을 제어하는 경우 또는 서드파티제의 URL 를 조작할 수 있는 경우)가 있는 경우, 서드파티제의 URL 를 제어하고 있는 경우, 서드파티제의 URL 는 CORS(현대 브라우저에서만 서포트되고 있는 것) 또는 JSON-P(CORS보다 전의 회피책)를 사용해 브라우저내의 크로스 도메인 요구에 액세스 할 수 있습니다.

또한 타사 공급자는 다른 서버의 요청을 받아들이도록 설계된 엔드포인트에서 원하는 데이터에 액세스할 수 있으며, 이 엔드포인트는 사용자가 앱을 인증할 수 있는 메커니즘을 제공합니다.가장 인기 있는 프로토콜은 OAuth입니다.

다른 답변에서 언급했듯이, python의 요청 모듈을 사용하는 것이 코딩의 관점에서 이 문제를 해결하는 가장 좋은 방법입니다.단, 코멘트(및 이 질문에 대한 이유)에 따라 요청이 거부되었다는 오류가 발생할 수 있습니다.이 에러는 SELinux가 원인일 가능성이 있습니다.

이것이 문제의 원인인지 아닌지를 확인하려면 , 우선, 다음의 커맨드로 SELinux 가 유효하게 되어 있는 것을 확인합니다.

sestatus

'Current Mode'가 'Enforce'이면 SELinux가 활성화됩니다.

다음으로 다음 명령을 사용하여 Apache에 직접 적용되는 현재 bool 값을 가져옵니다.

getsebool -a | grep httpd

apache가 TCP 요청을 네트워크에 발신할 수 있는지 여부를 결정하는 설정 'subd_can_network_connect'를 찾습니다.켜져 있으면 모든 Apache TCP 요청이 허용됩니다.이 기능을 켜려면 루트로 다음을 실행합니다.

setsebool -P httpd_can_network_connect 1

데이터베이스 액세스만 필요한 경우(이전에도 이 문제가 있어 SELinux가 의심되었습니다), 'httpd_cna_network_connect'만 켜는 것이 좋습니다.

이 정책의 목적은 해커가 아파치 서버를 납치할 경우 해커가 서버를 통해 내부 네트워크의 나머지 부분으로 나갈 수 없도록 하는 것입니다.

이게 댓글로 하는 게 나았을 것 같은데 제가 대표성이 부족해서...

출처 : https://tag1consulting.com/blog/stop-disabling-selinux https://wiki.centos.org/TipsAndTricks/SelinuxBooleans

언급URL : https://stackoverflow.com/questions/15463004/how-can-i-send-a-get-request-from-my-flask-app-to-another-site

반응형