← 목록
기타 2026-07-08 4KB 읽기 4분

웹소켓 검증카드 — ws/websocket 라이브러리 대응 (파동① "존재≠동작")

개요

크라우니 VM의 WebSocket opcode(780~787, 8종)가 실제로 동작하는지 실측 검증하고, crowny-rpnkit 라이브러리카드 시리즈(로깅/정규식/직렬화/차트/테스트에 이어) 형태로 대응카드+검증스크립트를 산출했다.

무엇을 했는지

  1. 인벤토리: 키워드.dat의 WS opcode 8종(301~308줄, WS업그레이드~WS상태) + hanseonc_high.c(1610~1617줄) 매핑 확인,
crownyc.c(15450~15627줄)에서 실제 구현 확인 — SHA1+Base64 RFC6455 핸드셰이크, 프레임 인코딩/디코딩, 마스킹 해제까지 실제 소켓 I/O 코드(DOM opcode 790~799 같은 스텁이 아님). pkg/libs/ 웹소켓 관련 16개 파일(웹소켓/웹소켓v2/웹소켓서버/웹소켓앱/게이트웨이웹소켓코어 × 각 .한선/.rpn.한선/.3layer/.rpn.3layer) 확인.

  1. 실측 1차 실패 → 근본원인 추적: 웹소켓v2.한선의 표준 API(소켓생성/소켓바인드/소켓수락)로 만든 소켓을 WS opcode에 넘기면 항상 -1 실패.
crownyc.c 소스 추적 결과: 소켓생성 계열은 VM 내부 "슬롯" 인덱스를 반환(sock_alloc())하고 sock_get()으로 실제 OS fd 변환이 필요하지만, WS opcode 780~787은 이 변환 없이 팝된 값을 그대로 raw fd로 send()/recv()/poll()에 사용한다. 반면 TCP대기/TCP수락(opcode 491/492)은 raw fd를 그대로 반환 — 이 경로로 바꾸자 핸드셰이크 101 + 8종 opcode 전부 정상 동작 확인.

  1. 부수 발견: 소켓생성/소켓바인드의 hanseonc_high 빌트인 테이블 arity가 실제 VM opcode(370/371)가 요구하는 인자 개수와 다름(소켓생성 1-arg 선언 vs 2-arg 필요, 소켓바인드 2-arg 선언 vs 3-arg 필요) — 별도 컴파일러 버그로 기록.
WS바이너리(786)는 주석상 "버퍼핸들"을 받는다고 되어 있으나 실제로는 문자열핸들만 허용(str_valid 검사) — 버퍼 전달 시 항상 -1.

  1. 최종 검증: 파이썬 표준 socket/hashlib으로 RFC6455 클라이언트를 직접 구현(외부 websocket 라이브러리 미사용)해
핸드셰이크 101 + Sec-WebSocket-Accept 값을 독립 계산과 바이트 단위로 비교, 텍스트 에코 왕복(한글 UTF-8), PING/PONG/BINARY/CLOSE opcode까지 전부 확인. 웹소켓검증.sh 최종 실행: PASS=7 FAIL=0 TRAP-CONFIRMED=2, 서버 프로세스/포트 잔류 없음.

관련 파일

  • /Users/ef/crowny-rpnkit/라이브러리카드/웹소켓카드.md — 대응표 + 정본 경로 예제 + 함정 전표(§함정1 슬롯vsRawFd, §함정2 WS바이너리 버퍼불가, §함정3 32KB 캡, §부록A 소켓생성/바인드 arity 버그)
  • /Users/ef/crowny-rpnkit/라이브러리카드/웹소켓검증.sh — 실행 가능 검증 스크립트(재검증: bash 웹소켓검증.sh)
  • /Users/ef/crowny-rpnkit/생성물/ws테스트/*.한선 — 조사 과정에서 만든 재현/단위 테스트 스크립트 모음(참고용, 정식 산출물 아님)
  • 근거 소스: /Users/ef/CrownyOS/crownyc/crownyc.c:15450-15627(WS opcode 구현), :9814-9860(소켓 슬롯 API), :11820-11874(TCP raw fd API)
  • /Users/ef/CrownyOS/crownyc/hanseonc_high.c:1610-1617(WS 키워드→opcode 테이블), :1390-1399(소켓 계열 arity 선언)

잔여 이슈

  • 소켓생성/소켓바인드 arity 불일치는 컴파일러(hanseonc_high.c) 버그 — 별도 수정 필요(이번 세션은 "기존 파일 수정 금지" 지시로 미수정, 발견만 기록).
  • WS바이너리 주석("버퍼핸들")과 실제 구현(문자열핸들) 불일치도 미수정.
  • 웹소켓v2.한선은 opcode 8종을 올바르게 호출하지만 WS서버생성() 내부가 슬롯 API를 써서 무력화된 상태 — 라이브러리 자체 패치는 후속 작업.
  • outbound(클라이언트로서 접속) WS 핸드셰이크는 opcode 미제공(서버측 Upgrade 처리만 존재) — 필요 시 신규 구현 필요.