pnpm exec playwright test tests/multi-device-auth.spec.ts --project=chromium cd frontend/apps/cs pnpm test:playwright ๐Ÿ’ก ์š”์•ฝ ๋ฐ ๊ถŒ์žฅ ๊ฐ€์ด๋“œ device-id์˜ ์œ ์ง€ ์ฒ˜๋ฆฌ ๋กœ๊ทธ์•„์›ƒ ์‹œ ํŒŒ๊ธฐ ๋Œ€์ƒ: ์ธ์ฆ ํ† ํฐ ์ฟ ํ‚ค (access-token, refresh-token) ๋กœ๊ทธ์•„์›ƒ ์‹œ ์œ ์ง€ ๋Œ€์ƒ: ๊ธฐ๊ธฐ ์‹๋ณ„์ž ์ฟ ํ‚ค ๋ฐ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ๋ฐ์ดํ„ฐ (device-id) ๋”ฐ๋ผ์„œ ํ˜„์žฌ ๊ตฌ์„ฑํ•˜์‹  ๋Œ€๋กœ ์ฟ ํ‚ค/๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์ƒ์˜ device-id๋Š” ๋กœ๊ทธ์•„์›ƒ ์‹œ ์ง€์šฐ์ง€ ์•Š๊ณ  ๋ธŒ๋ผ์šฐ์ €์— ์˜์†์ ์œผ๋กœ ๋‚จ๊ฒจ๋‘๋Š” ์„ค๊ณ„๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค. [WebServer] [WebServer] > cs@0.1.0 dev /Users/changwng/workspace.ona/frontend/apps/cs [WebServer] > next dev [WebServer] [WebServer] โš  Warning: Next.js inferred your workspace root, but it may not be correct. [WebServer] We detected multiple lockfiles and selected the directory of /Users/changwng/package-lock.json as the root directory. [WebServer] To silence this warning, set `outputFileTracingRoot` in your Next.js config, or consider removing one of the lockfiles if it's not needed. [WebServer] See https://nextjs.org/docs/app/api-reference/config/next-config-js/output#caveats for more information. [WebServer] Detected additional lockfiles: [WebServer] * /Users/changwng/workspace.ona/frontend/pnpm-lock.yaml [WebServer] [WebServer] โ–ฒ Next.js 15.5.18 [WebServer] - Local: http://localhost:3000 [WebServer] - Network: http://192.168.0.250:3000 [WebServer] - Environments: .env.local [WebServer] - Experiments (use with caution): [WebServer] ยท proxyTimeout: 600000 [WebServer] [WebServer] โœ“ Starting... [WebServer] โœ“ Ready in 1733ms [WebServer] โœ“ Compiled /middleware in 114ms (161 modules) [WebServer] โ—‹ Compiling /dashboard ... [WebServer] โœ“ Compiled /dashboard in 4.3s (6804 modules) Running 14 tests using 1 worker [WebServer] GET /dashboard 200 in 4913ms [WebServer] โ—‹ Compiling /api/proxy/[...url] ... [WebServer] โœ“ Compiled /api/proxy/[...url] in 10.2s (7070 modules) [WebServer] [BFF Proxy Error] Backend returned status 401 for user-service/login [WebServer] [BFF Proxy Error Body] {"status":400,"message":"ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.","code":"B001"} [WebServer] POST /api/proxy/user-service/login 401 in 10766ms โœ˜ 1 [chromium] โ€บ tests/multi-device-auth.spec.ts:64:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ httpOnly refresh-token ์ฟ ํ‚ค ์„ค์ • (10.8s) - 2 [chromium] โ€บ tests/multi-device-auth.spec.ts:81:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 2. PC/๋ชจ๋ฐ”์ผ/ํƒœ๋ธ”๋ฆฟ ๋…๋ฆฝ refresh-token ๋ฐœ๊ธ‰ - 3 [chromium] โ€บ tests/multi-device-auth.spec.ts:115:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 3. Silent Refresh RTR - ์ƒˆ ํ† ํฐ ๊ต์ฒด - 4 [chromium] โ€บ tests/multi-device-auth.spec.ts:138:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 4. PC RTR ๊ฐฑ์‹  ํ›„ ๋ชจ๋ฐ”์ผ ์„ธ์…˜ ๋…๋ฆฝ ์œ ์ง€ - 5 [chromium] โ€บ tests/multi-device-auth.spec.ts:161:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 5. Replay Attack - ๊ตฌ ํ† ํฐ ์žฌ์ฃผ์ž… โ†’ 400 - 6 [chromium] โ€บ tests/multi-device-auth.spec.ts:195:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 6. refresh-token ์—†์ด silent refresh โ†’ 401 - 7 [chromium] โ€บ tests/multi-device-auth.spec.ts:207:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 7. ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ โ†’ 401 - 8 [chromium] โ€บ tests/multi-device-auth.spec.ts:217:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 8. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ID โ†’ 401 - 9 [chromium] โ€บ tests/multi-device-auth.spec.ts:227:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 9. ๋กœ๊ทธ์•„์›ƒ ํ›„ ์ฟ ํ‚ค ์ „์ฒด ์‚ญ์ œ - 10 [chromium] โ€บ tests/multi-device-auth.spec.ts:250:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 10. PC ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋ชจ๋ฐ”์ผ ์„ธ์…˜ ๋…๋ฆฝ ์œ ์ง€ - 11 [chromium] โ€บ tests/multi-device-auth.spec.ts:272:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 11. UI ๋กœ๊ทธ์ธ ํ›„ httpOnly ์ฟ ํ‚ค E2E ํ™•์ธ - 12 [chromium] โ€บ tests/multi-device-auth.spec.ts:306:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 12. ๋™์ผ ๊ณ„์ • 3๊ฐœ ๋ธŒ๋ผ์šฐ์ € ๋™์‹œ ๋กœ๊ทธ์ธ - 13 [chromium] โ€บ tests/multi-device-auth.spec.ts:341:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 13. sameSite=Strict ์ฟ ํ‚ค ์†์„ฑ ํ™•์ธ - 14 [chromium] โ€บ tests/multi-device-auth.spec.ts:353:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 14. ์—ฐ์† 3ํšŒ RTR ๊ฐฑ์‹  - 4๊ฐœ ๊ณ ์œ  ํ† ํฐ 1) [chromium] โ€บ tests/multi-device-auth.spec.ts:64:7 โ€บ ๋‹ค์ค‘ ๋””๋ฐ”์ด์Šค ์ธ์ฆ & Refresh Token Rotation (RTR) ํ…Œ์ŠคํŠธ โ€บ 1. ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ httpOnly refresh-token ์ฟ ํ‚ค ์„ค์ • Error: expect(received).toBe(expected) // Object.is equality Expected: 200 Received: 401 67 | headers: { "X-Device-Id": DEVICE_PC }, 68 | }); > 69 | expect(response.status()).toBe(200); | ^ 70 | 71 | const headers = response.headersArray(); 72 | const refreshToken = getCookieValue(headers, "refresh-token"); at /Users/changwng/workspace.ona/frontend/apps/cs/tests/multi-device-auth.spec.ts:69:31 Error Context: test-results/multi-device-auth-๋‹ค์ค‘-๋””๋ฐ”์ด์Šค--4f452-ttpOnly-refresh-token-์ฟ ํ‚ค-์„ค์ •-chromium/error-context.md attachment #2: trace (application/zip) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ test-results/multi-device-auth-๋‹ค์ค‘-๋””๋ฐ”์ด์Šค--4f452-ttpOnly-refresh-token-์ฟ ํ‚ค-์„ค์ •-chromium/trace.zip Usage: pnpm exec playwright show-trace test-results/multi-device-auth-๋‹ค์ค‘-๋””๋ฐ”์ด์Šค--4f452-ttpOnly-refresh-token-์ฟ ํ‚ค-์„ค์ •-chromium/trace.zip