# 피드백 작성 전용 웹 전환 작업 ## 목표 이 저장소는 프로젝트별 피드백 작성 데모 페이지와 독립적인 BARON-SSO 로그인을 제공한다. 피드백 데이터만 운영 중인 관리자 콘솔의 API로 전송한다. - 관리자 콘솔: `https://feedback.hmac.kr/` - 현재 작업 저장소: `https://gitea.hmac.kr/b24014/egbim_qa_platform.git` - 현재 작업 대상: 프로젝트별 피드백 작성 데모 화면 및 데이터 API 연동 - 연동 구조: 작성 데모 웹/자체 인증 → 피드백 데이터 API → 관리자 콘솔 데이터 - 기존 `is-div/qa_platform` Pull Request: 병합하지 않음 이번 단계는 각 당사자에게 화면과 연동 방식을 설명하기 위한 데모 단계다. 관리자 콘솔의 화면이나 관리 기능을 이 저장소에 복제하지 않는다. ## 범위 ### 유지할 기능 - BARON-SSO 로그인 및 callback - 피드백 작성 화면 - 제목 및 내용 입력 - 사용자 IP 주소 입력 - MAC 주소 입력 - 모든 파일 형식의 첨부파일 업로드 - 첨부파일 용량 및 개수 제한 - 작성 완료 및 오류 메시지 - 피드백 댓글 작성·수정·삭제는 기존 관리자 콘솔에서 유지 - 피드백 등록 시 프로젝트 관리자 대상 Naver Works 알림은 기존 콘솔 API에서 유지 - 기존 스테이징 API 호출 ### 제외할 기능 - 피드백 목록 및 상세 관리 - 대시보드 - 프로젝트·채널·테넌트 생성 - 관리자 권한 설정 - 이슈 관리 - AI 설정 - 로컬 ABC API - 로컬 Secretary API - 로컬 MySQL 및 migration 실행 ## 작업 목록 ### 1. 프로젝트별 데모 연동 설계 - [x] 데모에서 workspace code를 경로로 전달하는 구조 확정 - [x] 프로젝트 코드, 프로젝트 ID, 채널 ID는 관리자 콘솔에서 매핑 - [x] 프로젝트별 피드백 양식 조회 방식 확인 - [x] 프로젝트별 피드백 등록 API 계약 확인 - [x] 프로젝트별 첨부파일 저장은 관리자 콘솔/Secretary가 담당 - [ ] 당사자 설명용 데모 URL과 예시 프로젝트 확정 ### 2. 외부 API 계약 확정 - [x] 기존 관리자 콘솔 코드에서 공개 API base URL 확인 - [x] 로그인 상태 확인 API 확인 - [x] 피드백 양식/필드 조회 API 확인 - [x] 피드백 생성 API 확인 - [x] 첨부파일 업로드 API 확인 - [x] API 인증 방식 확인 - [x] 기본 writer workspace를 `EGBIM_DEMO`로 고정해 미지정 SSO 사용자를 END_USER로 허용 - [x] CORS 회피를 위한 서버사이드 proxy 적용 - [ ] workspace code, project ID, channel ID 확정 - [ ] 기존 API가 사용하는 API Key 권한 확인 관리 콘솔이 공개하는 same-origin endpoint: ```text GET /api/support/access GET /api/support/workspaces/{workspaceCode}/form-template POST /api/support/workspaces/{workspaceCode}/tickets ``` 작성 데모는 위 endpoint를 서버사이드 proxy로 호출한다. 데모 웹의 내부 호출은 다음과 같이 분리한다. ```text GET /api/support/access GET /api/support/workspaces/{workspaceCode}/form-template POST /api/support/workspaces/{workspaceCode}/submit ``` 관리 콘솔 내부에서는 위 요청을 Secretary API와 프로젝트별 ABC API로 전달한다. 작성 데모는 ABC API를 직접 호출하지 않는다. 데모 웹 환경변수: ```text # Empty: browser calls stay same-origin and Next proxies admin API requests. NEXT_PUBLIC_API_BASE_URL= NEXT_PUBLIC_FEEDBACK_ONLY=true SUPPORT_CONSOLE_API_BASE_URL=https://feedback.hmac.kr/api/support SSO_ISSUER=https://sso.hmac.kr/oidc SSO_AUTHORIZATION_ENDPOINT=https://sso.hmac.kr/oidc/oauth2/auth SSO_TOKEN_ENDPOINT=https://sso.hmac.kr/oidc/oauth2/token SSO_USERINFO_ENDPOINT=https://sso.hmac.kr/oidc/userinfo SSO_SCOPE=openid profile email SSO_CLIENT_ID= SSO_CLIENT_SECRET= JWT_SECRET= SUPPORT_TENANT_ID= ``` The feedback-only Docker app leaves `NEXT_PUBLIC_API_BASE_URL` empty so browser calls stay same-origin. BARON-SSO login is handled by this application's own server-side auth flow and its own RP credentials. The management console is not used for login. 로컬 작성 앱의 인증 서버 환경에는 다음 값을 사용한다. ```text SSO_ISSUER=https://sso.hmac.kr/oidc SSO_CLIENT_ID= SSO_CLIENT_SECRET= # Leave blank to derive the callback from the browser host. This supports # both localhost:8864 and 10.13.10.4:8864. SSO_REDIRECT_URI= ``` `NEXT_PUBLIC_API_BASE_URL`은 피드백 전용 Docker에서 비워 둔다. 관리 콘솔 주소는 데이터 연동용 `SUPPORT_CONSOLE_API_BASE_URL`에만 설정한다. Client Secret은 브라우저 번들 또는 저장소에 포함하지 않는다. ### 3. 피드백 작성 데모 화면 정리 - [x] 피드백 작성 페이지를 기본 진입 화면으로 설정 - [x] 불필요한 목록·상세·관리 화면 링크 및 직접 접근 차단 - [x] 콘솔과 동일한 프로젝트명 `EGBIM_DEMO` 생성 - [x] `EGBIM_DEMO`를 첫 번째 예시 프로젝트로 사용 - [x] 현재 콘솔 매핑 확인: `projectId=8`, `channelId=9` - [x] 프로젝트 식별자만 바꾸면 다른 프로젝트에도 연결되도록 구성 - [x] 작성 페이지에 필요한 필드만 표시 - [x] 모든 파일 형식 첨부 허용 - [x] 파일 크기 30MB 제한 유지 - [x] 첨부파일 업로드 성공 여부 표시 - [x] 작성 완료 후 작성 화면에서 등록 완료 상태 표시 - [ ] API 오류를 사용자가 이해할 수 있는 메시지로 표시 ### 4. 인증 및 보안 - [x] BARON-SSO 로그인 흐름 확인 - [x] 새 웹 주소의 callback URI 등록 - [x] 자체 BARON-SSO RP의 로그인 URL 생성·callback·토큰 교환 구현 - [x] 자체 RP의 `SSO_CLIENT_ID`·`SSO_CLIENT_SECRET`을 서버 runtime에 주입 - [x] 콘솔 API 인증과 작성 앱 인증을 분리하고 피드백 데이터 API만 연동 - [x] access token을 브라우저에 불필요하게 노출하지 않도록 처리 - [ ] API Key를 클라이언트 번들에 포함하지 않도록 처리 - [x] 서버사이드 proxy 사용 시 authorization header 전달 확인 - [ ] Secret 및 개인키가 저장소에 포함되지 않았는지 확인 ### 5. 불필요한 코드 제거 API 계약과 화면 의존성 확인 후 아래 항목을 제거한다. - [ ] `apps/api` 제거 또는 별도 저장소로 분리 - [ ] `apps/secretary-api` 제거 또는 별도 저장소로 분리 - [ ] 로컬 DB compose 및 DB migration 제거 - [x] 관리자·대시보드·이슈·AI 관련 페이지는 데모 화면에서 노출하지 않음 - [x] 프로젝트·채널·테넌트 설정 화면은 데모 화면에서 노출하지 않음 - [ ] 피드백 목록·상세·댓글 관리 화면은 이 데모 웹에서 노출하지 않되, 기존 관리자 콘솔과 콘솔 API에서는 유지 - [ ] Naver Works 알림 처리와 프로젝트 관리자 라우팅은 기존 콘솔 API에서 유지 - [ ] E2E 및 로컬 통합 테스트 제거 또는 별도 보관 - [ ] CLI 및 개발용 실행 스크립트 정리 - [ ] 기존 데이터 migration SQL은 필요 여부 확인 후 보관 또는 제거 - [ ] 추적 중인 `.venv-migrate` 등 가상환경 파일 제거 삭제 전에 작성 페이지의 import와 Docker build가 통과하는지 확인한다. ### 6. 웹 전용 Docker 구성 - [x] `web` 서비스만 포함한 `docker/docker-compose.prod.yml` 구성 작성 - [x] 배포 workflow를 피드백 전용 compose와 8864 health check로 변경 - [x] API·Secretary·MySQL 서비스 의존성 제거 - [x] 웹 서비스 포트 환경변수화 - [x] 외부 API base URL 환경변수화 - [x] production build에서 브라우저 API base URL을 비우고 외부 API 주소를 서버 proxy에만 사용 - [x] 업로드 파일 저장은 외부 관리 콘솔/Secretary가 담당하도록 구성 - [x] Docker image build 확인 ### 7. 검증 - [x] 로그인하지 않은 사용자의 접근 처리 확인 - [ ] SSO 로그인 및 callback 확인 (새 RP/JWT_SECRET 주입 후 브라우저에서 확인) - [ ] 작성 양식 표시 확인 - [ ] 제목·내용만 작성하여 등록 확인 - [ ] IP·MAC 값 포함 등록 확인 - [ ] 이미지 첨부 등록 확인 - [ ] PDF·문서 등 비이미지 파일 첨부 확인 - [ ] 30MB 초과 파일 차단 확인 - [ ] API 등록 결과가 기존 관리 콘솔에 표시되는지 확인 - [ ] 오류·재시도 처리 확인 - [x] production Docker build 및 health check 확인 ### 8. 저장소 반영 및 배포 - [x] 변경 파일에 Secret·개인키·실제 환경파일이 없는지 확인 - [ ] `git status --short` 확인 - [ ] `git diff --stat` 확인 - [ ] 기능 단위 commit 생성 - [ ] `b24014/egbim_qa_platform`의 main에 push - [ ] 내부 서버 배포 - [ ] 배포된 API에서 실제 API 등록 테스트 ## 완료 조건 - 사용자는 피드백 작성 화면만 접근할 수 있다. - 로그인은 BARON-SSO를 통해 동작한다. - 관리 콘솔의 로그인·테넌트 설정을 변경하지 않고 자체 RP로 로그인된다. - 피드백은 `https://feedback.hmac.kr/` 관리자 콘솔에서 확인된다. - 첨부파일은 이미지와 일반 파일 모두 등록된다. - 프로젝트 식별자를 바꾸어도 같은 작성 화면 구조로 API 연동이 가능하다. - 로컬 ABC API, Secretary API, MySQL 없이 웹 컨테이너만 실행된다. - 저장소에 Secret이나 개인키가 포함되지 않는다. - 내부 서버에서 Docker build와 health check가 성공한다. ## 현재 보류 사항 API base URL만으로는 실제 endpoint와 인증 방식을 확정할 수 없다. 기존 관리 콘솔 주소와 API 서버 주소가 같지 않을 수 있으므로, API 계약 확인 전에는 `apps/api`, `apps/secretary-api`, 관련 server route를 삭제하지 않는다.