본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

경로와 쿼리 매개변수

~10 min · fastapi, params, auth

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

경로 매개변수는 REST 와 같아

FastAPI 의 경로 매개변수는 WebSocket 엔드포인트에서도 똑같이 작동해. @app.websocket('/ws/{room_id}')room_id: str 인자를 건네지. room_id: intuser_id: UUID 처럼 자료형 힌트를 주면 자동 변환도 해 줘.

websocket.query_params 로 쿼리 읽기

브라우저 WebSocket 생성자에는 사용자 지정 HTTP 헤더를 넣을 수 없다고 트랙 2 에서 배웠지. 그래서 인증 토큰이나 방 이름 같은 핸드셰이크 데이터를 쿼리 문자열로 운반해. 문자열을 담은 딕셔너리 같은 websocket.query_params 에서 값을 읽으면 돼.

accept() 전에 검증해

인증과 거절은 항상 accept() 보다 먼저 해야 해. 핸드셰이크 중에 닫으면 연결 비용이 0이지만, accept 뒤에 닫으면 클라이언트는 소켓이 잠깐 열린 뒤 쫓겨나는 모습을 보게 돼. 사용자 경험도 혼란스럽고 클라이언트가 잘못 처리하기 쉬워.

Code

경로·쿼리 검사와 빠른 거절·python
from fastapi import FastAPI, WebSocket
from uuid import UUID

app = FastAPI()

@app.websocket('/ws/{room_id}')
async def room(websocket: WebSocket, room_id: UUID):
    token = websocket.query_params.get('token')
    user = decode_jwt(token) if token else None
    if not user:
        # Reject before handshake completes — no .accept() yet
        await websocket.close(code=4001, reason='unauthorized')
        return

    await websocket.accept()
    await websocket.send_json({
        'type': 'welcome',
        'data': {'room': str(room_id), 'user': user['name']}
    })
    # ... continue handler

External links

Exercise

/ws/{room_id} 엔드포인트를 추가하고 ?token=... 을 필수로 받아. 토큰이 없거나 decode_jwt 가 None 을 돌려주면 코드 4001 로 거절해. 브라우저에서 유효한 토큰과 잘못된 토큰을 모두 시험하고, 유효한 토큰만 환영 메시지까지 받는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.