Python에서 Flask를 사용하는 경우
CORS(Cross Origin Resource Sharing) 설정이 필요할 수 있습니다. 예를들어
다른 도메인이나 로컬 환경에서 자바스크립트로 api 등을 호출하는 경우 브라우저에서 동일 출처 위반의 에러가 나타날 수 있습니다. 이를 해결하려면 어떻게 할까요?
이때
CORS를 설정할 수 있습니다. CORS는 자바스크립트를 사용한 api 등의 리소스 호출시
동일 출처(같은 호스트네임)가 아니더라도 정상적으로 사용 가능하도록 도와주는 방법입니다.
# python flask에서 CORS 설정하기
flask 앱에서 CORS를 설정하는 방법에 대하여 알아봅니다. 또한 원하는 호스트, 도메인 주소만 가능하도록 하려면 어떻게 하는지도 함께 알아보고자 합니다.
먼저 flask_cors는 파이썬 패키지 모듈이므로 pip를 사용하여 설치하도록 합니다.
pip install flask_cors
이제 설치된 flask_cors를 앱에서 사용하기 위해 추가 후 아래와 같이 코드를 입력합니다.
import flask_cors CORS, cross_origin
CORS(app)
이제 모든 도메인에 대하여 CORS가 설정되었습니다. 다른 도메인에서 해당 페이지를 스크립트로 호출하는 경우 CORS 에러가 더 이상 발생하지 않을 것 입니다.
! 특정 주소, 도메인, 포트 등만 사용 가능하도록 설정하기
만약 모든 곳이 아닌
원하는 주소만 호출할 수 있도록 변경할 수도 있습니다. CORS()의 두번째 인자에 resources를 사용하고 origin과 그 값으로 허용할 도메인 주소를 입력합니다.
CORS(app, resources={r'*': {'origins': '*'}})
CORS(app, resources={r'*': {'origins': 'https://webisfree.com'}})
CORS(app, resources={r'/_api/*': {'origins': 'https://webisfree.com:5000'}})
위 코드를 보면 각각 다르게 설정되어 있습니다. 우선 * 표시는 모든 것을 허용한다는 의미입니다.
@ 첫 번째 코드 살펴보기
맨 위의 코드는 모든 곳에서 호출하는 것을 허용하게 됩니다.
@ 두 번째 코드 살펴보기
두 번째 코드는 https://webisfree.com에서의 호출만 허용합니다.
@ 마지막 코드 살펴보기
마지막은 https://webisfree.com:5000으로 5000 포트를 명시하였습니다. 또한 추가적으로 /_api/의 하위 주소를 가지는 경우에만 호출이 가능합니다. 즉 https://webisfree.com:5000/_api/ 등의 주소를 호출할 때에만 정상적으로 리소스를 전달할 수 있습니다.
! 여러개의 호스트 주소 허용하기
이번에는 하나가 아닌 여러개의 도메인 주소를 허용하는 방법입니다.
CORS(application, resources={r'*': {'origins': ['https://webisfree.com', 'http://localhost:8080']}})
위와 같이 배열로 여러개의 주소를 허용할 수 있습니다. 위 코드는 두 개의 주소... webisfree.com 그리고 http://localhost:8080에 대하여 허용하도록 설정하였습니다.
여기까지 Python flask에서 CORS를 설정하는 방법에 대하여 자세히 알아보았습니다.
! CORS 에러가 계속 발생하는 경우
이 경우 서버보다는 ajax 호출 부분에서 CORS 설정이 잘못되었을 경우가 많습니다. API를 호출하는 프론트에서 이슈가 없나도 확인할 필요가 있습니다.