218 lines
9.7 KiB
Markdown
218 lines
9.7 KiB
Markdown
# 피드백 작성 전용 웹 전환 작업
|
|
|
|
## 목표
|
|
|
|
이 저장소는 프로젝트별 피드백 작성 데모 페이지와 독립적인 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=<local RP client id>
|
|
SSO_CLIENT_SECRET=<local RP client secret>
|
|
JWT_SECRET=<the same HS256 secret used by the support API>
|
|
SUPPORT_TENANT_ID=<optional; use this when userinfo does not include 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=<local RP client id>
|
|
SSO_CLIENT_SECRET=<local RP 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를 삭제하지 않는다.
|