웹소켓 업그레이드

WebSocket upgrade

HTTP 핸드셰이크로 연결을 시작한 뒤 양방향 메시지 채널로 전환합니다.

···
html
<div class="n-demo"><div class="n-head"><strong>HTTP → WEBSOCKET</strong><span>LIVE TRACE</span></div><div class="n-stage"><div class="ws n-box">CLIENT</div><div class="ws-center"><div id="ws-kind">Upgrade request →</div><div id="ws-line"></div><div id="ws-message">waiting for 101</div></div><div class="ws n-box">SERVER</div></div><div class="n-foot">tap to step · auto replay</div></div>
css
.n-demo{width:min(94vw,760px);height:min(88vh,324px);padding:clamp(9px,2.2vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(5px,1.3vmin,10px);font:600 clamp(12px,2.4vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;overflow:hidden}.n-head,.n-foot{display:flex;justify-content:space-between;align-items:center;color:var(--muted)}.n-head strong{color:var(--accent)}.n-head span,.n-foot{font-size:12px}.n-stage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(4px,1vmin,10px)}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.n-box{padding:clamp(5px,1.5vmin,11px);border:1px solid var(--line);border-radius:8px;background:var(--bg);text-align:center}.n-on{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.n-muted{color:var(--muted)}@media(max-width:400px){.n-head span{display:none}}.ws{width:21%}.ws-center{width:52%;text-align:center;display:grid;gap:8px}.ws-center div:first-child{color:var(--accent)}#ws-line{height:3px;background:var(--line);border-radius:3px;position:relative}#ws-line:after{content:"";position:absolute;top:-5px;left:0;width:13px;height:13px;border-radius:50%;background:var(--accent);animation:travel 1.05s linear infinite alternate}@keyframes travel{to{left:calc(100% - 13px)}}#ws-message{color:var(--muted)}
js
let step=0;function advance(){const labels=['Upgrade request →','← 101 Switching Protocols','message →','← message'];document.getElementById('ws-kind').textContent=labels[step];document.getElementById('ws-message').textContent=step<2?'HTTP handshake':'two-way channel';step=(step+1)%4}
const clickTarget=document.querySelector('.n-demo');if(clickTarget&&typeof advance==='function'){advance();const timer=setInterval(advance,1050);clickTarget.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})}

웹소켓은 HTTP 요청의 업그레이드 핸드셰이크로 시작합니다. 서버가 전환을 수락하면 같은 연결에서 클라이언트와 서버가 서로 메시지를 보낼 수 있습니다.

데모는 업그레이드 뒤 말풍선 방향이 교대로 바뀝니다. 실시간 기능에 알맞지만 연결 수명, 인증, 끊김 뒤 재접속을 별도로 다뤄야 합니다.

언제 쓰나

채팅이나 공동 편집처럼 양쪽이 자주 새 메시지를 보내야 할 때 고려합니다.

페이지로 열기 ↗