참고: HTTP와 HTTPS 웹의 언어 - 코딩과 함께 배우는 네트워크 6일차
우리가 6일차에 배웠던 HTTP는 데이터를 암호화하지 않고 그대로 주고받기 때문에, 중간에 누군가가 데이터를 엿보거나(도청), 내용을 바꿔치기(변조)할 위험이 있었습니다.
특히 로그인 정보, 개인 정보, 결제 정보 같은 민감한 데이터를 HTTP로 주고받는 것은 매우 위험합니다.
이러한 문제를 해결하기 위해 등장한 것이 바로
HTTPS(HyperText Transfer Protocol Secure)
입니다.
HTTPS는 HTTP 통신 내용을
SSL(Secure Sockets Layer)
또는 그 후속 기술인
TLS(Transport Layer Security)
라는 프로토콜을 이용해 암호화하여 안전하게 보호합니다.
SSL/TLS의 주요 역할
데이터 암호화 (Confidentiality)
클라이언트(웹 브라우저)와 서버 간에 주고받는 모든 데이터를 암호화하여, 중간에 가로채더라도 내용을 알 수 없게 합니다.
서버 인증 (Authentication)
클라이언트가 접속하려는 서버가 정말 신뢰할 수 있는 진짜 서버인지 확인시켜 줍니다. (가짜 은행 사이트 접속 방지 등)
Python의 http.server 모듈과 ssl 모듈을 이용하여 매우 간단한 HTTPS 웹 서버를 만들어 보겠습니다.
import http.server # 기본적인 HTTP 서버 기능을 제공하는 모듈import ssl # SSL/TLS 기능을 제공하는 모듈import socketserver # 고급 소켓 서버 기능을 제공하는 모듈 (여기서는 TCP 서버 기반) # 서버 설정HOST = 'localhost' # 또는 '0.0.0.0' (모든 인터페이스에서 접속 허용)PORT = 8443 # HTTPS 기본 포트는 443이지만, 테스트용으로 다른 포트 사용 # 사용할 SSL 인증서 파일 경로 (위에서 생성한 파일들)CERT_FILE = 'server.crt' # 자체 서명 인증서 파일KEY_FILE = 'server.key' # 개인키 파일 # 간단한 요청 핸들러 정의 (기본 SimpleHTTPRequestHandler 사용) # 이 핸들러는 현재 디렉터리의 파일들을 웹으로 제공합니다.Handler = http.server.SimpleHTTPRequestHandler # TCP 서버 생성 (아직 SSL 적용 전) # socketserver.TCPServer를 사용하면 다중 요청 처리가 더 용이합니다.httpd = socketserver.TCPServer((HOST, PORT), Handler) # SSL 컨텍스트 생성 및 설정 # ssl.PROTOCOL_TLS_SERVER는 최신 TLS 프로토콜 버전을 사용하도록 권장됩니다.ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) # 생성한 인증서 파일과 개인키 파일을 로드합니다.ssl_context.load_cert_chain(certfile=CERT_FILE, keyfile=KEY_FILE) # 생성한 TCP 서버 소켓을 SSL 소켓으로 래핑(Wrapping)합니다.httpd.socket = ssl_context.wrap_socket(httpd.socket, server_side=True)print(f"[*] HTTPS 서버가 https://{HOST}:{PORT} 에서 실행 중입니다...")print("[*] 웹 브라우저에서 위 주소로 접속하세요.")print("[*] (자체 서명 인증서이므로 브라우저에서 보안 경고가 나타날 수 있습니다.)")print("[*] Ctrl+C를 눌러 서버를 종료할 수 있습니다.")try: # 서버 실행 (요청을 계속 처리) httpd.serve_forever()except KeyboardInterrupt: print("\n[*] HTTPS 서버를 종료합니다.")finally: httpd.server_close() # 서버 소켓 닫기 print("[*] 서버가 안전하게 종료되었습니다.")
ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
SSL/TLS 통신 설정을 위한 컨텍스트 객체를 만듭니다.
PROTOCOL_TLS_SERVER는 서버 측에서 TLS 프로토콜을 사용하겠다는 의미이며, 보안상 권장되는 설정입니다.
오늘은 웹 통신의 보안을 책임지는 HTTPS와 SSL/TLS 인증서에 대해 배우고, 직접 자체 서명 인증서를 만들어 Python으로 간단한 HTTPS 웹 서버를 구축하는 실습까지 진행했습니다.
자체 서명 인증서로 인해 브라우저에서 보안 경고가 뜨는 것을 보았지만, 이를 통해 SSL 인증서가 신뢰할 수 있는 CA를 통해 발급되어야 하는 이유를 더욱 명확히 알 수 있었습니다.
다음 시간에는 지금까지 배운 네트워크 지식을 총정리하고, 앞으로 더 깊이 있는 학습을 위한 로드맵을 그려보는 시간을 갖겠습니다.