Flask 서버(Python)에서 HTTP 대신 HTTPS로 통신하려면 다음과 같은 방법이 있습니다:
ref: Miguel Grinberg의 블로그
0. SSL 인증서 검증을 강제로 우회하는 방법
안드로이드 클라이언트 측면
개발/디버깅용으로만 쓰는 방법입니다. 아래는 OkHttp 클라이언트에서 SSL 검증을 무시하는 코드입니다
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(getUnsafeSslSocketFactory(), getUnsafeTrustManager())
.hostnameVerifier((hostname, session) -> true)
.build();
getUnsafeSslSocketFactory()
및 getUnsafeTrustManager()
구현은 생략했지만 원하면 바로 코드 제공 가능합니다.
1. 개발 환경에서 HTTPS 사용하기
개발 환경에서 간단하게 HTTPS를 활성화하려면, Flask의 개발 서버에서 임시 SSL 인증서를 생성하여 사용할 수 있습니다. 이를 위해 ssl_context='adhoc'
옵션을 app.run()
에 추가합니다:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Flask is running with HTTPS!'
if __name__ == '__main__':
app.run(ssl_context='adhoc')
이렇게 하면 Flask는 자동으로 임시 SSL 인증서를 생성하여 HTTPS를 통해 통신합니다. 그러나 이 방법은 개발 환경에서만 사용해야 하며, 브라우저에서 보안 경고가 나타날 수 있습니다.
=> 안드로이드 엡에서 동작하지 않습니다.
2. 자체 서명된 SSL 인증서 사용하기
자체 서명된 SSL 인증서를 생성하여 로컬 개발 환경에서 HTTPS를 사용할 수도 있습니다. 이를 위해 OpenSSL을 사용하여 인증서와 키를 생성한 후, Flask 앱에 적용합니다
- OpenSSL을 사용하여 인증서와 키 생성
openssl req -new -newkey rsa:2048 -nodes -keyout cert.key -x509 -days 365 -out cert.crt
각 옵션의 의미는 다음과 같습니다 -openssl req: 인증서 요청을 생성하거나 처리하는 OpenSSL의 서브커맨드입니다. -new: 새로운 인증서 서명 요청(CSR, Certificate Signing Request)을 생성하겠다는 옵션입니다. -newkey rsa:2048: 새로운 RSA 키 쌍을 생성하며, 키 길이는 2048비트로 설정합니다. -nodes: 생성된 개인 키를 암호화하지 않습니다. 즉, 개인 키에 암호를 설정하지 않아 암호 입력 없이 사용할 수 있습니다. -keyout cert.key: 생성된 개인 키를 cert.key 파일에 저장합니다. -x509: CSR 대신 자체 서명된 인증서를 직접 생성합니다. -x509 옵션이 없으면 CSR이 생성되며, 이를 CA에 제출하여 서명된 인증서를 받아야 합니다. -days 365: 생성된 인증서의 유효 기간을 365일로 설정합니다. -out cert.crt: 생성된 인증서를 cert.crt 파일에 저장합니다.
이 명령어를 실행하면 2048비트 RSA 키 쌍과 함께, 유효 기간이 1년인 자체 서명된 SSL/TLS 인증서가 생성됩니다. 이러한 인증서는 개발 및 테스트 환경에서 주로 사용
-
생성된 인증서를 Flask 앱에 적용
from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'Flask is running with HTTPS!' if __name__ == '__main__': app.run(ssl_context=('cert.crt', 'cert.key'))
이 방법 또한 개발 환경에서만 사용해야 하며, 브라우저에서 보안 경고가 나타날 수 있습니다.
안드로이드 클라이언트 측면
자체 서명 인증서를 명시적으로 신뢰하도록 설정하기 (개발 과정중)
1. res/raw/my_cert.crt
폴더에 서버의 인증서 파일 추가
예: res/raw/my_cert.crt
(PEM 형식)
2. network_security_config.xml
작성
your.server.com
대신 IP 주소를 사용할 경우에는 Android 10 이상에서만 지원됩니다.
3. AndroidManifest.xml
에 적용
3. 운영 환경에서 HTTPS 사용하기
운영 환경에서는 Flask의 내장 서버 대신, Nginx와 같은 웹 서버를 리버스 프록시로 사용하여 HTTPS를 처리하는 것이 일반적입니다. 이 방법은 보안과 성능 면에서 더 우수합니다. 기본적인 절차는 다음과 같습니다:
- SSL/TLS 인증서 발급: Let's Encrypt와 같은 인증 기관을 통해 도메인에 대한 SSL/TLS 인증서를 발급받습니다.
- Nginx 설정: Nginx를 설치하고, 발급받은 인증서를 사용하여 HTTPS를 처리하도록 설정합니다. Flask 애플리케이션은 일반적으로 WSGI 서버(예: Gunicorn, uWSGI)를 통해 실행되며, Nginx는 리버스 프록시로 동작하여 클라이언트의 요청을 Flask 애플리케이션으로 전달합니다.
이러한 설정을 통해 운영 환경에서 안전하게 HTTPS를 사용할 수 있습니다.
주의사항
- 개발 환경에서 임시 또는 자체 서명된 인증서를 사용할 경우, 브라우저에서 보안 경고가 나타날 수 있습니다. 이는 개발 목적으로만 사용해야 하며, 운영 환경에서는 신뢰할 수 있는 인증 기관에서 발급한 인증서를 사용해야 합니다.
- Flask의 내장 개발 서버는 운영 환경에서 사용하기에 적합하지 않습니다. 운영 환경에서는 Gunicorn, uWSGI와 같은 WSGI 서버와 Nginx 또는 Apache와 같은 웹 서버를 함께 사용하는 것이 권장됩니다.
0 댓글