-
Notifications
You must be signed in to change notification settings - Fork 0
05 Security and Privacy
hywznn edited this page Jul 21, 2026
·
5 revisions
FOWOCO는 근로자 정보를 다루므로 기능보다 먼저 최소 수집, tenant 격리, 사람 승인, token 만료, 감사, 복구를 코드로 강제합니다.
UI에서 숨기는 것만으로는 보안이 아닙니다. 서버의 query, command, 상태 전이, token 검증, AI 입력, event payload에서 막아야 합니다.
| 등급 | 예시 | 처리 |
|---|---|---|
| 공개·비민감 | 지원 언어·TaskType | 일반 응답 가능 |
| 업무 최소정보 |
worker_id, 표시 이름, 언어, 체류 만료일 |
tenant/Role 검사 후 사용, AI 최소 입력 가능 |
| 개인정보 | 전화번호, 생년월일, 상세 주소 | 최소 수집·마스킹·접근 제한 |
| 고위험 민감정보 | 외국인등록번호, 여권번호, 계좌번호 | AI 전송 금지, 필요 시 분리·암호화 |
| 원본 문서 | 신분증 image, 계약서 전문 | 제한 저장·권한·보존기간, AI 원문 전송 금지 |
| Secret/Token | JWT secret, DB password, LLM key, Worker Link token | Secret 관리, hash 가능한 token은 hash, log/Git 금지 |
- 인증 token의
company_id를 tenant 범위의 시작점으로 사용합니다. - Client body/query의
company_id로 권한을 결정하지 않습니다. - business query는 resource ID와
company_id를 함께 조건으로 사용합니다. - 목록·상세·수정·file·AI Run·Audit 조회에 같은 원칙을 적용합니다.
- 다른 사업장 resource는 존재 여부를 드러내지 않는 403/404 정책을 일관되게 사용합니다.
- A/B 두 사업장을 만든 통합 테스트로 IDOR을 검증합니다.
- event handler와 background recovery도 원래
company_id를 다시 검사합니다.
| 구분 | 설명 | 대표 권한 |
|---|---|---|
ADMIN |
사업장 관리자 | 사용자·설정·감사 조회, HR 업무 |
HR / HR_USER
|
HR 담당자 | 근로자·Task·승인·증빙 |
VIEWER |
조회자 | 허용된 최소 조회 |
WORKER_LINK |
만료 token을 사용한 근로자 | 해당 업무 안내·응답·문서 제출 |
AI_AGENT |
검증 전 AI 제안 actor | 후보 제안만, 승인 권한 없음 |
SYSTEM_RULE |
만료·재시도·복구 규칙 | 정해진 command만 수행 |
근로자는 계정을 만들지 않습니다. 공개 link actor에는 원본 token 대신 안전한 link reference를 기록합니다.
- Access Token은 짧은 수명으로 설정합니다.
- Refresh Token은 DB에 원문 대신 hash를 저장하고 rotation합니다.
- logout·비활성화·재사용 탐지 시 token family를 폐기합니다.
- JWT payload에 여권번호·전화번호 같은 개인정보를 넣지 않습니다.
- Authorization/Cookie 전문을 log·trace에 출력하지 않습니다.
- cookie 기반 인증을 도입하면 현재 CSRF 정책을 다시 검토합니다.
- 충분히 긴 암호학적 난수 token을 생성하고 DB에는 hash만 저장합니다.
-
expires_at,revoked_at, 사용 횟수·최대 횟수·rotation 정책을 관리합니다. - 승인된 현재 Task version에서만 link를 발급합니다.
- 재발급 시 이전 link를 즉시 폐기합니다.
- 공개 응답은 해당 안내와 허용 행동만 포함합니다.
- 변조·만료·폐기 token은 동일한 안전 오류로 응답합니다.
- access log와 metric에서 URL token을 redact합니다.
- 문서는 token 범위 upload API에서 격리 저장한 뒤 size·MIME·hash·파일명을 검사합니다.
- upload 완료가 문서 승인·Task 완료를 뜻하지 않습니다.
- 응답·upload에 rate limit과 idempotency를 적용합니다.
AI에 보낼 수 있는 기본 field:
-
worker_id, 표시 이름, 언어 - 업무상 필요한 국적·체류 만료일·계약 기간
- 문서 유형·상태
- TaskType·Workflow Context
보내지 않는 값:
- 외국인등록번호·여권번호·전화번호·계좌번호
- 원본 신분증 image·계약서 전문
- Worker Link token·JWT·Secret
- 업무와 무관한 주소·가족·건강 정보
민감정보가 자유 입력에 포함될 수 있으므로 DTO 제한뿐 아니라 Provider 호출 직전 pattern 탐지·제거·차단을 수행합니다. 탐지 실패를 정상 후보로 숨기지 않습니다.
AI Run → 검증된 후보 → HR 확정/편집 → 승인 snapshot → Worker Link
- AI 성공은 Task 생성·승인·발송을 뜻하지 않습니다.
- AI 원본과 HR 수정본, changed field를 분리해 저장합니다.
- 승인자·시각·대상 Task version·사유를 저장합니다.
- 날짜·금액·대상·문서 종류·안내 내용 변경은 기존 승인을 무효화합니다.
- 승인 전 또는 승인 무효화 뒤 Worker Link·완료를 차단합니다.
- 완료증빙이 필요한 Task는 검증된 evidence 없이 완료할 수 없습니다.
- Actor, action, target,
request_id,trace_id, 시각을 기록합니다. - before/after는 마스킹 요약 또는 안전한 snapshot reference로 저장합니다.
- AuditEvent 일반 수정·삭제 API를 제공하지 않습니다.
- IP와 User-Agent는 기본적으로 원문 저장하지 않습니다. 보안 감사에 필요하다고 ADR에서 승인한 경우에만 목적·접근 역할·마스킹 또는 hash·보존기간·삭제 책임을 함께 정합니다.
- Event payload는 후속 처리에 필요한 최소 ID·version만 포함합니다.
- Prompt·request body·token·개인정보를 metric label이나 span attribute로 사용하지 않습니다.
-
company_id,worker_id,run_id,request_id처럼 cardinality가 큰 값도 metric label로 쓰지 않습니다. - 예외 수집 도구가 request/response body를 자동 첨부하지 않도록 확인합니다.
- 사용자 파일명 대신 서버 생성 storage key를 사용합니다.
- extension만 믿지 않고 MIME·size·허용 형식·hash를 함께 검사합니다.
- CSV/XLSX 행·열·size 제한과 formula injection·zip bomb·path traversal을 방어합니다.
- Import 오류와 log에 전체 근로자 row 원문을 넣지 않습니다.
- commit에는 idempotency와 선택 row 검증을 적용합니다.
- 원본 파일 보존기간·삭제 책임·백업 포함 여부를 정합니다.
- download와 연결에도 tenant와 Role을 다시 검사합니다.
- 모든 query·background handler가
company_id범위를 검사하는가? - DTO·event·metric·span에 불필요한 개인정보가 없는가?
- log에 token·Secret·Prompt·원문 개인정보가 없는가?
- AI 입력에 금지 field와 자유 입력 탐지가 적용됐는가?
- Role 부족·타 사업장·만료 token·악성 file test가 있는가?
- 중요 변경과 AuditEvent가 같은 transaction 경계인가?
- 승인 전·재승인 전 전달을 우회할 경로가 없는가?
- retry·duplicate event가 중복 Task/Link를 만들지 않는가?
-
.env, key, 인증서, 실제 개인정보 seed가 commit되지 않았는가?