## 완료 항목
- ✅ index.html base href: /taxbaik/admin/
- ✅ 모든 API 경로: 상대경로
- ✅ E2E 테스트: 로컬 완벽 통과
- ✅ WASM 부팅: 정상
## 운영서버 필수 사항
⚠️ Nginx 설정 변경 필수:
변경 전:
location /taxbaik {
proxy_pass http://127.0.0.1:5001;
}
변경 후:
location /taxbaik/ {
proxy_pass http://127.0.0.1:5001/;
rewrite ^/taxbaik/(.*)$ /$1 break;
}
## 이유
- PathBase 제거로 앱이 /taxbaik을 인식하지 않음
- Nginx에서 /taxbaik 프리픽스를 제거해야 함
- 이렇게 하면 로컬/운영 모두 동일한 상대경로 동작
## 테스트 결과
로컬:
✅ 공개 페이지: 5/5 통과
✅ 대시보드: 4/4 통과 (퀵테스트)
운영:
⏳ Nginx 수정 후 재테스트 필요
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Changes:
1. admin-session.js: Use name attribute selectors instead of placeholder
- Changed: querySelector('input[placeholder="사용자명"]')
- To: querySelector('input[name="username"]')
- Reason: Placeholder selectors are fragile with DOM mutations
2. playwright.config.ts: Extend test timeouts for WASM boot
- Test timeout: 120s → 180s
- Expect timeout: 60s → 90s
- Reason: Blazor WASM bundle takes 60-120s to boot in local dev
3. tests/e2e/admin-login.spec.ts: Increase assertion timeouts
- Dashboard heading visibility: 20s → 60s
- Logout link visibility: timeout added 30s
4. tests/e2e/blog-crud.spec.ts: New comprehensive blog CRUD test
- Tests complete login flow
- Validates localStorage token storage
- Checks blog list page navigation
Status: Login form submission now works with proper field selection.
Remaining: Blazor WASM boot optimization needed for production.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Problem: With prerender: true + JavaScript form submission + location.reload(),
WASM hydration wasn't completing fast enough after page reload, leaving the
user on the login page despite successful token storage.
Solution: Complete rewrite to pure Blazor native login (prerender: false).
This approach:
1. WASM boots and renders the form
2. User submits form (Blazor handles it)
3. HttpClient POST to /api/auth/login
4. Save tokens to localStorage
5. CustomAuthenticationStateProvider.LoginAsync() called directly in C#
6. Blazor detects auth state change synchronously
7. NavigateTo() redirects to dashboard
8. All in same Blazor context, no reload needed
Benefits:
- Auth state update is synchronous with login response
- No WASM boot race conditions
- Direct C# call to CustomAuthenticationStateProvider
- Blazor handles redirect after auth state is confirmed
Trade-off: Login page requires WASM boot (brief spinner) instead of immediate
prerender display. This is acceptable for better reliability.
Result: Reliable login-to-dashboard flow with no hanging spinners or 'loading'
states.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>