파이썬(Python)/Flask

[Python]flask의 cors란? 예제를 통해 차이점 이해하기(flask_cors, 파이썬)

끄적끄적아무거나 2023. 8. 21. 09:22
반응형

 

목차

     

     

     

     

     

     

    [Python]flask의 cors란?

     

    CORS(Cross-Origin Resource Sharing)는 웹 애플리케이션에서 보안 상의 이유로 다른 도메인에서 리소스에 접근하는 것을 제한하는 브라우저 정책입니다. 동일 출처 정책(Same-Origin Policy)에 의해 웹 페이지는 자신과 동일한 출처에서만 리소스를 로드하도록 제한되어 있습니다. 이는 보안을 유지하고 악의적인 코드로부터 사용자 데이터를 보호하기 위한 중요한 기능입니다.

     

    CORS는 이러한 제한을 느슨하게 만들어 다른 도메인에서도 웹 페이지 리소스에 접근할 수 있도록 하는 메커니즘입니다. 서버 측에서 CORS 정책을 설정하면 특정 도메인들로부터의 요청을 수락하게 되며, 이를 통해 다른 도메인에서 웹 서버에 요청을 보내고 응답을 받을 수 있습니다.

     

    Flask-CORS는 Flask 애플리케이션에서 CORS를 구현하기 위한 도구로, CORS 정책을 쉽게 설정하고 관리할 수 있도록 도와줍니다. Flask-CORS를 사용하는 경우는 다음과 같습니다:

     

    API 서버 구축: 만약 Flask를 사용하여 RESTful API 서버를 구축하고 있고, 다른 도메인의 웹 애플리케이션에서 이 API에 접근해야 할 경우에 Flask-CORS를 사용할 수 있습니다.

    싱글 페이지 애플리케이션(SPA): 웹 애플리케이션이 싱글 페이지 애플리케이션인 경우, 서버와 클라이언트가 다른 도메인에 있을 수 있습니다. 이때 클라이언트 애플리케이션이 서버의 API에 접근해야 할 때 Flask-CORS를 사용할 수 있습니다.

    외부 도메인과의 통합: 서버의 데이터나 서비스를 외부 도메인의 웹 페이지에서 활용하려면, 해당 도메인에서 서버에 접근이 가능하도록 CORS를 설정해야 합니다.

     

     

    간단히 정리하면 CORS는 해킹에 대한 보안 정책으로 HTTP페이지에서 다른 서버로 접속할때 차단해줍니다. 이때 일반적인 접속은 허용해주지만 <script>에 포함된 명령 중에 다른 서버로 접속 하려고 할때 차단이 발생합니다. 아래 예제를 읽어 보시면 쉽게 이해할 수 있습니다. 

     

     

     

     

     

    예제를 통해 차이점 이해하기(flask_cors)

     

    예제코드- app.py>>

    from flask import Flask, jsonify
    from flask_cors import CORS
    
    app = Flask(__name__)
    
    # 모든 경로에 대해 CORS 설정을 허용합니다.
    CORS(app)
    
    @app.route('/')
    def index():
        data = {'message': '안녕하세요! CORS 문제가 없는 데이터입니다.'}
        return jsonify(data)
    
    if __name__ == '__main__':
        app.run()

    2, 4번 라인을 통해 cors를 flask 환경에서 실행해줍니다.

    9~13번 라인: 서버에 접속 시 json 형태로 데이터를 전달합니다.

     

     

     

     

     

    예제 코드-index.html>>

    <!DOCTYPE html>
    <html>
    <head>
        <title>CORS 예제</title>
    </head>
    <body>
        <h1>CORS 예제</h1>
        <script>
            fetch('http://127.0.0.1:5000/')
                .then(response => response.json())
                .then(data => {
                    console.log(data.message);
                })
                .catch(error => {
                    console.error('데이터 가져오기 실패:', error);
                });
        </script>
    </body>
    </html>

    위 html 파일은 go live와 같은 프로그램으로 다른 서버로 동작 시킵니다.

     

     

     

    결과>>

    html은 5500포트에서 동작했고 flask는 5000포트에서 동작합니다. 서로 다른 포트에서 동작 했고 console.log로 정상적으로 값이 출력되었음을 확인할 수 있습니다. 

     

     

     

    cmd curl로 헤더값(header) 확인하기>>

    C:\Users\forgo>curl -i http://127.0.0.1:5000/
    HTTP/1.1 200 OK
    Server: Werkzeug/2.3.6 Python/3.11.1
    Date: Mon, 21 Aug 2023 00:20:05 GMT
    Content-Type: application/json
    Content-Length: 121
    Access-Control-Allow-Origin: *
    Connection: close
    
    {"message":"\uc548\ub155\ud558\uc138\uc694! CORS \ubb38\uc81c\uac00 \uc5c6\ub294 \ub370\uc774\ud130\uc785\ub2c8\ub2e4."}

    위와 같이 윈도우(window) 커맨드 창에서 curl을 사용해서 http get 요청을 보냈고 위와 같은 값을 받습니다. 

     

     

    Access-Control-Allow-Origin: *

     

    위 내용이 CROS를 허용하게 해주는 헤더 입력 값이 됩니다. 

     

     

     

    예제 코드 다운로드

     

    app.py
    0.00MB
    index.html
    0.00MB

    반응형