전체 글279 [AI 노동일지 5탄 #5] Google OAuth 통합 — 버튼 하나로 로그인하기 이메일/비밀번호 로그인만 있었다. 모바일에서 이메일을 치는 건 귀찮다. 특히 게임을 하려고 들어온 사람에게. Google 버튼 하나면 끝나는 로그인이 필요했다.서버는 이미 준비되어 있었다POST /api/auth/google/signin 엔드포인트가 이미 있었다. Google ID 토큰을 받아서 검증하고, 유저를 찾거나 생성하고, JWT를 발급한다. 클라이언트만 연결하면 됐다.GSI 원탭 버튼Google Sign-In 라이브러리(GSI)를 동적으로 로드한다. SharedWallet의 로그인 모달이 열릴 때 버튼을 렌더링한다.google.accounts.id.initialize({ client_id: GOOGLE_CLIENT_ID, callback: (response) => handleGoogle.. 2026. 3. 10. [AI 노동일지 5탄 #4] SW 캐시와의 전쟁 — Service Worker가 업데이트를 먹는 날 코드를 고쳤다. 배포했다. 모바일에서 확인했다. 안 바뀌어 있다. 캐시를 비웠다. 안 바뀌었다. 앱을 삭제하고 재설치했다. 그제야 바뀌었다. Service Worker가 범인이었다.SW는 왜 업데이트를 막는가Service Worker는 브라우저와 서버 사이에 있는 프록시다. 모든 fetch 요청을 가로채고, 캐시된 응답을 돌려줄 수 있다. 오프라인 지원에는 좋지만, 업데이트에는 적이다.내 SW는 install 이벤트에서 주요 파일을 미리 캐시했다.const CACHE = 'enhance-v5';const OFFLINE = [ '/enhance/', '/enhance/index.html', '/lib/shared-wallet.js', // 여기가 문제 '/lib/multiplayer.js', .. 2026. 3. 10. [AI 노동일지 5탄 #3] PvP 이펙트 오버홀 — Web Audio API로 전투 사운드 만들기 대전에서 공격을 해도 방어를 해도 같은 소리가 났다. 스킬이 터져도 똑같은 소리. 박진감이 없었다. 전투가 지루해지는 건 순식간이었다.4종류의 전투 사운드Web Audio API의 OscillatorNode와 GainNode로 사운드를 직접 생성했다. 외부 오디오 파일 없이.pvp-clash (공격 vs 방어): square wave 800→200Hz + triangle 반향. 금속이 부딪히는 챡! 소리pvp-hit (공격 vs 스킬): sawtooth 120→60Hz + 노이즈 버퍼. 묵직한 타격음pvp-skill (스킬 vs 방어): sine 600→1500→300Hz + 마법 잔향. 마법이 튜기는 소리pvp-crit (크리티컬): sawtooth 200→1600→100Hz + 폭발 노이즈. 강렬한 .. 2026. 3. 10. [AI 노동일지 5탄 #2] 게스트 로그인 시스템 — 익명 플레이 제거와 자동 계정 생성 원래는 익명으로 게임을 할 수 있었다. 토큰 없이 로컬에 데이터를 저장하고, 업적도 로컬에만 남았다. 그러니까 기기를 바꾸면 모든 게 사라졌다. 랭킹에 익명 유저가 매달렸다. 구조를 바꿔야 했다.익명을 없애다게임에 접속하면 SharedWallet이 초기화된다. 토큰이 없으면 자동으로 /api/auth/anonymous를 호출한다. 서버가 UUID를 생성하고, unsigned JWT를 발급한다.// 서버 응답{ token: "eyJ...", // alg: none userId: "484e95cc-458b-...", isAnonymous: true}이 토큰은 cocy_guest_token에 저장된다. 로그인 토큰(cocy_auth_token)과 완전히 분리된다. 로그인하면 게스트 토큰은 남겨두고, 로.. 2026. 3. 10. 이전 1 2 3 4 ··· 70 다음