Skip to content

feat: 근로자 보안 링크(Worker Link) 발급, 안내, 문서제출, 응답제출 구현 - #76

Open
chaeliki wants to merge 34 commits into
mainfrom
feat/7-worker-link
Open

feat: 근로자 보안 링크(Worker Link) 발급, 안내, 문서제출, 응답제출 구현#76
chaeliki wants to merge 34 commits into
mainfrom
feat/7-worker-link

Conversation

@chaeliki

@chaeliki chaeliki commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

왜 필요한가요?

Closes #7

#7(근로자 링크)의 API 4개를 구현했습니다.

완료된 범위

API 4개

  • POST /tasks/{taskId}/worker-link 근로자 링크 발급/재발급
  • GET /public/worker-links/{token} 근로자 공개 안내 조회
  • POST /public/worker-links/{token}/documents 근로자 문서 제출
  • POST /public/worker-links/{token}/responses 근로자 응답 제출

보안 설계

  • 토큰: SecureRandom(32바이트) + Base64 URL-safe + SHA-256 해싱
  • Tenant bootstrap: WorkerLinkTenantBootstrap (AuthTenantBootstrap 패턴, JPA 구현 완료)
  • 승인된 현재 Task version에서만 발급 (ApprovalRequest.isValidFor() 재사용)
  • #13StoredFile/FileStorage 재사용, verified 필드로 AVAILABLE 판단
  • Cache-Control: no-store
  • 감사 로그 연동 (ActorType.WORKER_LINK)
  • 존재하지 않는/만료된/폐기된 링크를 410으로 통일 (존재 여부 비노출)
  • 근로자 QUESTION/NOT_UNDERSTOOD 응답 시 WorkerLink.conversationStatusNEEDS_FOLLOWUP으로 전환
  • Idempotency-Key(헤더 방식, Stripe 패턴 참고): 같은 (taskId, idempotency_key) 조합 재시도 시 기존 발급 결과 그대로 반환

발견하여 수정한 버그

  • SecurityConfig에 공개 API 경로 permitAll() 등록 누락 (실제로는 401로 막히던 문제)

통합 테스트

  • WorkerLinkSecurityIntegrationTest 4개 (전체 흐름, 미승인 Task 거부, 타 사업장 격리, 존재하지 않는 토큰)

결정 사항

  • AuditAction.WORKER_LINK_RESPONSE_SUBMITTED 추가, AuditTargetType은 기존 TASK 재사용 (ApprovalService 패턴 확인 후 결정)
  • Rate Limit/replay detection은 관련 인프라 자체가 없어, 후속이슈로

아직 확인 필요 — 후속 조치

  • workerUrl 형식: /worker-portal 라우트만 확인됨, 정확한 파라미터 전달 방식은 미확정. 현재는 원문 토큰만 반환
  • PostgreSQL SECURITY DEFINER 함수 미배포
  • clientRequestId 중복 제출 방지 (documents API) 구현 가능하나 이번 PR에는 미포함
  • document-request-draft 연동 #61 완료 후 처리 예정

검증

  • ./gradlew clean test 전체 통과

chaeliki added 28 commits July 31, 2026 17:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker Link] 로그인 없는 근로자 보안 링크와 응답 구현

1 participant