Skip to content

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

Description

@hywznn

한 줄 목표

근로자가 계정 없이도 만료되는 보안 링크로 승인된 최소 안내만 확인하고, 제한된 응답과 요청 문서만 제출하도록 구현합니다.

근로자가 할 수 있는 행동

  • 안내 확인
  • 질문 있음
  • 이해 안 됨
  • 요청받은 파일 제출

링크 하나로 다른 업무·근로자·사업장 정보를 탐색할 수 없어야 합니다.

소유 API 4개

  • POST /tasks/{taskId}/worker-link — HR이 승인된 업무 링크 발급/회전
  • GET /public/worker-links/{token} — 근로자용 최소 안내 조회
  • POST /public/worker-links/{token}/documents — 토큰 범위의 문서 제출
  • POST /public/worker-links/{token}/responses — 허용된 응답 제출

별도 재발급 endpoint를 만들지 않습니다. 발급 요청의 rotateExisting=true가 기존 링크를 폐기하고 새 링크를 발급하며, 같은 Idempotency-Key 재시도로 링크가 중복 생성되지 않아야 합니다.

구현 범위

  • WorkerLink, WorkerResponse, token-scoped upload 연결 모델과 migration
  • 충분히 긴 난수 token 생성, DB에는 원문이 아닌 hash 저장
  • 만료·폐기·회전·최대 사용 횟수 정책
  • 승인된 현재 Task version에서만 링크 발급
  • 공개 조회 DTO에 최소 안내·언어·허용 행동만 노출
  • 문서를 격리 저장한 뒤 크기·MIME·hash·파일명 검증
  • #13의 FileStorage port 사용, 검증된 ID만 response와 Task에 연결
  • QUESTION, NOT_UNDERSTOOD, 문서 제출 시 HR 후속 업무/활동 이력 생성
  • 접근·응답·제출·만료·폐기 event와 actor WORKER_LINK 기록
  • token 원문이 URL 외 로그·metric·trace에 남지 않도록 필터링
  • Rate Limit과 반복 공격에 동일한 안전 오류 적용

기본 정책

  • 재발급 시 이전 링크는 즉시 폐기합니다.
  • 만료·폐기·변조 token은 존재 여부를 구분하지 않는 오류로 응답합니다.
  • 자유 입력은 허용 목적, 길이, 파일 형식을 제한합니다.
  • 업로드 완료가 곧 문서 승인이나 Task 완료를 뜻하지 않습니다.
  • 자동 외부 메시지 발송은 MVP 범위가 아닙니다.

완료 조건

  • 승인 전 또는 승인 무효화된 업무에는 링크를 발급할 수 없습니다.
  • 유효한 링크에서 최소 안내·응답·문서 제출만 가능합니다.
  • 만료·폐기·변조 token과 타 업무 접근이 차단됩니다.
  • 재발급 후 이전 링크가 동작하지 않습니다.
  • DB 유출만으로 사용 가능한 token을 복원할 수 없습니다.
  • 응답에 전화번호·여권번호·외국인등록번호·내부 메모가 없습니다.
  • 같은 응답/문서 재시도로 중복 활동이나 Task가 생기지 않습니다.
  • 링크 보안, 파일 제한, 상태 전이, 감사 통합 테스트가 있습니다.

이번 이슈에서 하지 않는 것

  • 근로자 계정과 비밀번호
  • 공개 링크에서 HR 내부 메모 노출
  • 범용 파일 공유·메시지 앱 자동 발송
  • 바이러스 검사 인프라 전체 운영

선행/후속 관계

용어 도움말

  • Token hash: token 원문을 복원하기 어렵게 변환해 저장한 값입니다.
  • 격리 저장: 검증이 끝나기 전 제출 파일을 일반 문서와 분리하는 처리입니다.
  • Rate Limit: 짧은 시간의 과도한 요청을 제한하는 규칙입니다.

Metadata

Metadata

Assignees

Labels

area:serverSpring Boot API·도메인·DB·tenant·Task Workflow 영역; Prompt·모델·Provider 구현 제외priority:P0MVP 진행을 막는 최우선 핵심 작업security:privacy개인정보·접근권한·토큰·보안 영향이 있는 작업status:blocked선행 작업이나 외부 조건 때문에 현재 진행할 수 없는 작업type:feature사용자 또는 Agent가 사용하는 기능 개발

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions