웹 개발 학습 노트 (4) - 재 정립 및 HSTS

6444 단어 httphstspythonflask
돌이켜보다
  • 앞의 글 의 내용 을 통 해 우 리 는 Flask 프레임 워 크 를 기반 으로 하 는 간단 한 Web 응용 프로그램 을 구축 했다. server.py 의 코드 는 다음 과 같다
    from flask import Flask
    from flask.views import MethodView
    app = Flask(__name__)
    
    class IndexHandler(MethodView):
        def __init__(self, name):
            print(name)
    
        def get(self):
            return 'It is a GET request'
    
        def post(self):
            return 'It is a POST request'
    
    if __name__ == '__main__':
        app.add_url_rule('/', view_func=IndexHandler.as_view('index'))
        context = ('./server.cer', './server.key')
        app.run(port=443, host='0.0.0.0', debug=True, threaded=True, ssl_context=context)
    . 또한 우 리 는 이 를 위해 공공 네트워크 IP 와 도 메 인 이름 www.awesome.com 을 신청 하고 Let 's Encrypt 의 HTTPS 인증 서 를 배치 했다. 현재 브 라 우 저 주소 표시 줄 에 입력 https://www.awesome.com 할 때우리 사 이 트 를 방문 할 수 있 습 니 다.
  • 그러나 저희 사 이 트 는 아직도 몇 가지 문제 가 존재 합 니 다.
    1.     http://www.awesome.com
    2.            https://       https      
    이 를 위해 저 희 는 server 포트 를 다시 작성 하고 감청 80 포트 를 다시 작성 해 야 합 니 다. 모든 요청 에 응답 하고 모든 redirect 요청 을 http 요청 으로 재 설정 해 야 합 니 다. 마지막 으로 저 희 는 https 을 켜 서 사용자 에 게 편 의 를 제공 할 것 입 니 다.안전성 을 높이 는 동시에 잘못된 접근 을 줄 입 니 다.
  • 감청 HSTS 포트
  • 우리 의 목적 을 고려 하 는 것 은 단지 방향 을 바 꾸 기 위해 서 이다. 우 리 는 잠시 80 를 버 리 고 Flask 자체 가 가지 고 있 는 네트워크 라 이브 러 리 로 간단 한 Python 을 써 서 그것 을 연습 하 는 demo 로 생각 하 는 것 이 좋 겠 다. 문서 와 결합 하여 우 리 는 server 를 새로 만 들 고 다음 과 같은 내용
    from wsgiref.util import setup_testing_defaults
    from wsgiref.simple_server import make_server
    
    def simple_app(environ, start_response):
        status = '200 OK'
        headers = [('Content-type', 'text/plain; charset=utf-8')]
        start_response(status, headers)
    
        ret = [("%s: %s
    " % (key, value)).encode("utf-8") for key, value in environ.items()] return ret with make_server('0.0.0.0', 80, simple_app) as httpd: httpd.serve_forever()
  • 을 작성 할 수 있다.~/webapp/redirect.py 요청 을 http 요청 으로 재 설정 합 니 다.
  • 재 정립 https 을 실현 하기 위해 우 리 는 이런 하 나 를 구성 해 야 한다 redirect.
  • 그것 의 http responseStatus Code
  • 이다.
  • 그것 의 301 Moved Permanently 에는 redirect 의 목표 주소 headers 가 포함 되 어 있 습 니 다. 그 중에서... 사용자 가 요청 한 Location: https://... 입 니 다. 예 를 들 어 첫 페이지 URI 는 바로 URI 입 니 다. 다음은 이것 https://www.awesome.com/ 을 예 로 들 면.
  • 마지막 으로 URI 을 비 워 두 면 된다
  • 따라서 우 리 는 이러한 response body
    HTTP/1.1 301 Moved Permanently
    Content-length: 0
    Location: https://www.awesome.com/
    을 얻 을 수 있다. 우 리 는 이에 따라 response headers 의 내용
    from wsgiref.util import request_uri
    from wsgiref.simple_server import make_server
    
    def simple_app(environ, start_response):
        uri = request_uri(environ)            #    client       URI
        location = uri[:4] + 's' + uri[4:]    #   http     https
        status = '301 Moved Permanently'      #    Status Code
        headers =   [ ('Content-length', '0'), ('Location', location) ] #    headers
    
        start_response(status, headers)
        return b''
    
    httpd = make_server('0.0.0.0', 80, simple_app)
    httpd.serve_forever()
  • 을 수정 할 수 있다.
  • 이로써 우리 가 새로 작성 한 redirect.py 은 이미 완성 되 었 습 니 다. 우 리 는 server 디 렉 터 리 아래 에 ~/webapp/ 하 나 를 열 고 다음 명령
    python3 redirect.py
    을 실행 합 니 다. 이어서 우 리 는 브 라 우 저의 개발 자 도 구 를 열 고 주소 표시 줄 에 입력 합 니 다 Terminal. 만약 모든 것 이 순조롭다 면 개발 자 도구 에서 www.awesome.com 점프 를 볼 수 있 습 니 다.그리고 다시 301
  • 로 바 뀌 었 습 니 다.
    오픈 https://www.awesome.com
  • HSTS 을 열기 위해 서 는 HSTS 에 다음 과 같은 기록
    Strict-Transport-Security: max-age=15768000; includeSubDomains; preload
    이상 의 내용 을 추가 하여 http response headers 서 비 스 를 제공 하 는 https 에 추가 하면 되 기 때문에 수정 server 이 필요 합 니 다. 먼저 ~/webapp/server.py 을 도입 한 다음 make_response 방법 에서 생 성 get() 하여 원래 의 생 성 응답 방법 을 교체 해 야 합 니 다. 이 어 새로운 방법 을 추가 합 니 다.resp = make_response('It is a GET request') 기록 headers. 따라서 다음 과 같다 resp.headers['Strict-Transport-Security']
    from flask import Flask, make_response
    from flask.views import MethodView
    app = Flask(__name__)
    
    class IndexHandler(MethodView):
        def get(self):
            resp = make_response('It is a GET request')
            resp.headers['Strict-Transport-Security'] = 'max-age=15768000; includeSubDomains; preload'
            return resp
    
    if __name__ == '__main__':
        app.add_url_rule('/', view_func=IndexHandler.as_view('index'))
        context = ('./server.cer', './server.key')
        app.run(port=443, host='0.0.0.0', debug=True, threaded=True, ssl_context=context)
  • 저장 server.py 을 한 후에 우 리 는 server.py
    python3 server.py
    을 실 행 했 습 니 다. 이 어 우 리 는 흔적 없 는 모드 로 방문 server.py 했 습 니 다. 개발 자 도구 에서 우 리 는 먼저 www.awesome.com 점프 를 볼 수 있 습 니 다. 그리고 자동 으로 진행 되 는 301 에 대한 요청 을 한 후에 우 리 는 https://www.awesome.com 에 새로 추 가 된 response headers 을 볼 수 있 습 니 다.기록 되 었 습 니 다. 이때 만약 에 우리 가 다시 입력 Strict-Transport-Security 하면 개발 자 도구 에서 볼 수 있 습 니 다. 점프 코드 는 www.awesome.com 에서 301, 즉 307 로 바 뀌 었 습 니 다. 이것 은 브 라 우 저 내부 에서 진행 되 는 방향 입 니 다. 브 라 우 저 는 우리 의 Internal Redirect 를 거치 지 않 고 우리 의 http 로 바 꿔 주 었 습 니 다.불필요 한 방문 을 줄 였 습 니 다. 이것 도 https 가 가 져 온 좋 은 점 중 하나 입 니 다.
  • 편폭 에 한 하여 본 고 는 redirect.py 에 어떻게 가입 하 는 지 설명 하고 자 한다 HSTS. http response headers 에 관 한 내용 을 더 알 고 싶다 면 이 블 로그: HSTS 학습 노트 를 참고 할 수 있다.
  • 참고 자료
  • wsgiref — WSGI Utilities and Reference Implementation, Python Docs
  • how-to-redirect-http-to-https-in-flask, Stack Overflow
  • HSTS 학습 노트
  • 좋은 웹페이지 즐겨찾기