Python × HTTP: 자물쇠 없는 5056번 문에 https를 꽂아 400이 난 기록

400 현장의 등장인물, gunicorn 2인 체제 기록, 워커 메모리와 인증서 질문만 남긴 글.

Python × HTTP: 자물쇠 없는 5056번 문에 https를 꽂아 400이 난 기록

이 글은 문제 발생에서 문제 해결까지의 문제 발생 다음에 이어집니다. 다음 글은 주니어 팁 풀어쓰기입니다.

이야기, 토큰 코드, journalctl, curl 해결은 중심 글에 있다. 여기에는 그 글을 읽을 때 필요한 배역과, 중심 글에 없는 서버 기록·질문만 둔다.

1. 도입 (Context & Goal)

400은 가게가 망가진 것이 아니다. 자물쇠 없는 문에 열쇠를 꽂아 문지기가 되돌려보낸 말이다.

이름실제 정체비유
Hetzner 서버독일 회사에서 빌린 컴퓨터24시간 돌아가는 가게 건물
대시보드주식 봇 상태를 보는 웹페이지매장 홀
5056포트 번호5056번 출입문
그록봇자동으로 일해주는 AI알바생
HTTP / HTTPS인터넷 대화 방식 2종류그냥 문 / 자물쇠 달린 문

코드에는 IP 차단, 횟수 제한, fail2ban이 없다. 있는 검사는 비밀번호(토큰)뿐이다. 그 함수는 중심 글에 있다.

현장에 남은 로그는 이 한 줄이다. 바이트를 칸으로 나누는 법은 다음 글이다.

1
2
code 400, message Bad request version
"\x16\x03\x01\x00\x8a\x01..." 400

2. 트러블슈팅 (Micro-Debugging)

Hetzner Object Storage in location HEL1 degraded는 사진·파일 창고 상품의 장애다. 컴퓨터 대여와 다른 상품이라, 이 서버 알림이 없는 것이 맞다.

3. 해결 과정 & 코드 (Solution)

3-1. 실무로 한 일 (Before / After)

400의 해결(그록 PC 터미널의 curl)은 중심 글 3장이다. 이 글에만 있는 서버 변화는 gunicorn이다.

Before — 포장마차. 개발용 서버 1명이 주문·요리·서빙을 혼자 한다. RSI가 5분이면 그 사이 다른 접속은 멈춘다.

After — gunicorn. 매니저 1명과 요리사 2명. 한 명의 긴 요리 중에도 다른 손님을 받는다. 확인된 상태:

1
2
3
4
5
Active: active (running)
Main PID: 144072 (매니저)
   ├─ 144078 (요리사 1)
   └─ 144079 (요리사 2)
Starting gunicorn 23.0.0

검토만 하고 쓰지 않은 길이 하나 있다. 서버 안에서 ops_token_client로 127.0.0.1:5056을 두드리는 방법이다. YYYYMMDD는 날짜를 넣으라는 빈칸이고, 당시 파일은 20260915, 20260916, 20260917이었다. 루프백이 왜 다른 문인지는 주니어 팁에 있다.

3-2. 면접 연습 종합: 질문 → 내 답 → 점수 → 모범 답

라운드 A — 워커를 늘리면 끝날까?

질문 A1. 요리사(worker)를 2명으로 늘렸는데, RSI가 15분짜리가 되고 사용자가 동시에 3명 붙으면 어떻게 될까? 요리사를 계속 늘리면 될까, 아니면 주문서를 받아 두고 나중에 처리하는 작업 큐가 필요할까? 메모리에서는 무엇이 먼저 터질까?

모범 답. 요리사 2명이면 15분 작업 2개까지 동시에 돌아가고, 3번째는 빈 요리사를 기다린다. 프로세스는 앱을 통째로 들므로 RAM이 먼저 찬다. 긴 분석은 HTTP 요청 안에서 끝내지 말고 큐로 뺀다.

라운드 B — 같은 문에서 http와 https

질문 B1. 같은 포트에서 http와 https를 동시에 받을 수 없는 이유는 뭘까? IP만 있을 때 무료 인증서를 받으려면 무엇이 더 필요하고, 스스로 만든 인증서를 쓰면 크롬은 어디서 또 막힐까?

모범 답. 문지기는 첫 바이트로 말을 고른다. HTTP는 GET /로, HTTPS는 \x16으로 시작한다. 공개 인증서(Let’s Encrypt)는 보통 도메인이 필요하다. 스스로 만든 인증서는 브라우저가 발급자를 모른다며 연결 경고에서 멈춘다.

4. 딥다이브 (What I Learned)

Performance & Memory (리스크)

1인 체제는 병목(Bottleneck, 좁은 통로에서 길이 막히는 현상)이다. RSI 5분 동안 새로고침도 멈춘다. 요리사 2명이면 그 대기가 갈라진다. 워커를 끝없이 늘리면 프로세스마다 메모리를 쓴다. 이 400 자체는 워커 수로 줄지 않는다. 요청이 앱에 들어가기 전에 끊기기 때문이다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.