경로 매개변수는 REST 와 같아
FastAPI 의 경로 매개변수는 WebSocket 엔드포인트에서도 똑같이 작동해. @app.websocket('/ws/{room_id}') 는 room_id: str 인자를 건네지. room_id: int나 user_id: UUID 처럼 자료형 힌트를 주면 자동 변환도 해 줘.
websocket.query_params 로 쿼리 읽기
브라우저 WebSocket 생성자에는 사용자 지정 HTTP 헤더를 넣을 수 없다고 트랙 2 에서 배웠지. 그래서 인증 토큰이나 방 이름 같은 핸드셰이크 데이터를 쿼리 문자열로 운반해. 문자열을 담은 딕셔너리 같은 websocket.query_params 에서 값을 읽으면 돼.
accept() 전에 검증해
인증과 거절은 항상 accept() 보다 먼저 해야 해. 핸드셰이크 중에 닫으면 연결 비용이 0이지만, accept 뒤에 닫으면 클라이언트는 소켓이 잠깐 열린 뒤 쫓겨나는 모습을 보게 돼. 사용자 경험도 혼란스럽고 클라이언트가 잘못 처리하기 쉬워.