# SAM E-Sign 요구사항 정의서

> **프로젝트명**: SAM E-Sign (전자계약 서명 솔루션)
> **작성일**: 2026-02-12
> **버전**: v1.0
> **작성자**: DX 추진팀
> **상태**: 구현 완료

---

## 1. 프로젝트 개요

### 1.1 배경

현재 계약 서명 업무는 대면 또는 우편으로 진행되어 시간과 비용이 소요된다.
외부 전자계약 서비스(모두싸인 등)를 사용할 수 있으나, SAM 시스템과의 통합 및 데이터 주권 확보를 위해 자체 솔루션을 구축한다.

### 1.2 목적

두 당사자(계약 생성자 A, 상대방 B)가 온라인으로 PDF 계약서에 전자서명하고, 서명 완료된 문서를 법적 효력이 있는 형태로 보관하는 시스템을 구축한다.

### 1.3 목표

| 목표 | 측정 기준 |
|------|----------|
| 계약 처리 시간 단축 | 대면 서명 대비 80% 이상 시간 절감 |
| 보안 요건 충족 | 문서 무결성 검증, 본인인증, 감사 추적 |
| 법적 효력 확보 | 전자서명법 제2조 요건 충족 |
| 사용 편의성 | 3단계 이내 계약 생성, 비로그인 서명 |

### 1.4 이해관계자

| 역할 | 설명 | 시스템 내 역할 |
|------|------|--------------|
| 계약 생성자 (A) | 계약서를 작성하고 서명을 요청하는 사람 | SAM MNG 로그인 사용자 |
| 서명 상대방 (B) | 이메일 링크를 통해 서명하는 사람 | 비로그인, 토큰 기반 접근 |
| 시스템 관리자 | SAM 시스템 운영자 | 테넌트 관리 |

---

## 2. 범위

### 2.1 포함 범위 (v1.0)

| # | 기능 | 설명 |
|---|------|------|
| 1 | 2인 서명 | 생성자(갑) + 상대방(을) |
| 2 | PDF 기반 계약 | PDF 파일 업로드 및 관리 |
| 3 | 순차 서명 | 상대방 먼저 또는 작성자 먼저 |
| 4 | 이메일 OTP 인증 | 6자리 코드, 5분 유효 |
| 5 | 캔버스 직접 서명 | 터치/마우스 서명 입력 |
| 6 | 문서 무결성 검증 | SHA-256 해시 비교 |
| 7 | 감사 추적 로그 | 모든 행위 기록 (삭제 불가) |
| 8 | 이메일 알림 | 서명 요청, 리마인더 발송 |
| 9 | 서명 거절 | 사유 입력 후 거절 처리 |
| 10 | 계약 관리 대시보드 | 통계, 목록, 필터, 검색 |

### 2.2 제외 범위 (v2 이후)

| 기능 | 사유 |
|------|------|
| 3인 이상 다자간 서명 | v1 안정화 후 확장 |
| 카카오/PASS 본인인증 | 외부 API 연동 필요 |
| SMS OTP | 외부 서비스 비용 발생 |
| 워드/한글 문서 편집 | PDF 전환 후 사용 |
| 공인인증서 연동 | 별도 모듈 개발 필요 |
| 블록체인 공증 | 기술 검토 후 결정 |
| 템플릿 관리 | v2에서 추가 |
| 외부 API 제공 | v2에서 추가 |

---

## 3. 기능 요구사항

### FR-001: 계약 생성

| 항목 | 내용 |
|------|------|
| **ID** | FR-001 |
| **제목** | 전자계약 생성 |
| **우선순위** | 필수 |
| **설명** | 로그인 사용자가 PDF 파일을 업로드하고 계약 정보를 입력하여 전자계약을 생성한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 계약 제목 입력 (필수, 최대 200자) | |
| 2 | 계약 설명 입력 (선택, 최대 2000자) | |
| 3 | PDF 파일 업로드 (필수, 최대 20MB) | PDF 형식만 허용 |
| 4 | 서명 순서 선택 | 상대방 먼저(기본) / 작성자 먼저 |
| 5 | 서명 기한 설정 (기본 7일) | 현재 시점 이후 날짜 |
| 6 | 작성자(갑) 정보 입력 | 이름(필수), 이메일(필수), 전화번호(선택) |
| 7 | 상대방(을) 정보 입력 | 이름(필수), 이메일(필수), 전화번호(선택) |
| 8 | 계약 코드 자동 생성 | 형식: ES-YYYYMMDD-RANDOM6 |
| 9 | 업로드 시 SHA-256 해시 자동 생성 | 문서 무결성 검증용 |
| 10 | 생성 완료 후 서명 위치 지정 화면으로 이동 | |

**비즈니스 규칙**:
- 계약 생성 시 초기 상태는 "초안(draft)"
- 서명자 2인이 자동 생성됨 (작성자 + 상대방)
- 각 서명자에게 128자 고유 접근 토큰 발급

---

### FR-002: 서명 위치 지정

| 항목 | 내용 |
|------|------|
| **ID** | FR-002 |
| **제목** | PDF 서명 위치 지정 |
| **우선순위** | 필수 |
| **설명** | 업로드된 PDF 위에 각 서명자의 서명 필드 위치를 시각적으로 지정한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | PDF를 브라우저에서 렌더링 (PDF.js) | 페이지 네비게이션 제공 |
| 2 | 클릭으로 서명 필드 추가 | 서명자별 색상 구분 (갑:파랑, 을:빨강) |
| 3 | 드래그로 필드 위치 이동 | |
| 4 | 필드 크기 조절 | |
| 5 | 필드 타입 선택 | 서명, 도장, 텍스트, 날짜, 체크박스 |
| 6 | 필드 라벨 입력 | 예: "갑 서명", "을 서명" |
| 7 | 필수 여부 설정 | 기본값: 필수 |
| 8 | 좌표값은 % 기반 저장 | 다양한 PDF 크기 대응 |
| 9 | 저장 시 기존 필드 삭제 후 재생성 | |
| 10 | 초안(draft) 상태에서만 설정 가능 | |

**비즈니스 규칙**:
- 최소 1개 이상의 서명 필드가 있어야 서명 요청 발송 가능
- 필드 좌표는 페이지 기준 백분율(0~100%)로 저장

---

### FR-003: 서명 요청 발송

| 항목 | 내용 |
|------|------|
| **ID** | FR-003 |
| **제목** | 서명 요청 이메일 발송 |
| **우선순위** | 필수 |
| **설명** | 서명 필드 설정 완료 후 첫 번째 서명자에게 서명 요청 이메일을 발송한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 발송 전 체크리스트 표시 | 필드 설정 여부, 서명자 정보, PDF 무결성 |
| 2 | 서명 순서 최종 확인 | 변경 불가 (생성 시 결정) |
| 3 | 발송 버튼 클릭 시 이메일 발송 | 서명 링크 포함 |
| 4 | 계약 상태 변경 | draft → pending |
| 5 | 첫 서명자 상태 변경 | waiting → notified |
| 6 | 이메일에 계약 제목, 서명 링크, 기한 포함 | |

**비즈니스 규칙**:
- 서명 필드가 설정되지 않으면 발송 불가
- 초안(draft) 상태에서만 발송 가능
- 서명 순서에 따라 첫 번째 서명자에게만 이메일 발송

---

### FR-004: 본인인증 (OTP)

| 항목 | 내용 |
|------|------|
| **ID** | FR-004 |
| **제목** | 이메일 OTP 본인인증 |
| **우선순위** | 필수 |
| **설명** | 서명자가 서명 링크에 접속하면 이메일 OTP로 본인인증을 수행한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 서명 링크 접속 시 계약 정보 표시 | 제목, 서명자, 기한 |
| 2 | 인증 코드 발송 버튼 | 등록된 이메일로 발송 |
| 3 | 6자리 숫자 OTP 생성 | random_int(100000, 999999) |
| 4 | OTP 유효 시간: 5분 | 초과 시 재발송 필요 |
| 5 | 최대 시도 횟수: 5회 | 초과 시 인증 차단 |
| 6 | 인증 성공 시 세션 토큰 발급 | sign_session_token |
| 7 | 인증 후 서명 화면으로 자동 이동 | |
| 8 | 재발송 기능 제공 | |

**비즈니스 규칙**:
- 비로그인 접근 (토큰 기반)
- OTP 시도 횟수 초과 시 해당 토큰으로 재인증 불가
- 인증 완료 시각을 DB에 기록 (auth_verified_at)

---

### FR-005: 전자서명 수행

| 항목 | 내용 |
|------|------|
| **ID** | FR-005 |
| **제목** | 전자서명 수행 |
| **우선순위** | 필수 |
| **설명** | 본인인증 완료 후 계약서를 확인하고 캔버스에 직접 서명한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 3단계 프로세스 | 문서 확인 → 서명 입력 → 서명 확인 |
| 2 | PDF 문서 다운로드/열람 링크 | |
| 3 | 동의 체크박스 | "계약 내용 확인 및 전자서명 동의" |
| 4 | 캔버스 서명 입력 | SignaturePad 라이브러리 |
| 5 | 터치 및 마우스 지원 | 모바일/PC 모두 대응 |
| 6 | 서명 지우기 기능 | |
| 7 | 서명 미리보기 | 확인 단계에서 표시 |
| 8 | 서명 이미지 저장 | base64 PNG → 파일 저장 |
| 9 | 서명 시 IP, User-Agent 기록 | |
| 10 | 서명 완료 후 done 화면으로 이동 | |

**비즈니스 규칙**:
- 동의 체크 없이 서명 단계 진행 불가
- 서명이 비어있으면 제출 불가
- 서명 완료 시 signer 상태: authenticated → signed
- 모든 서명자 완료 시 계약 자동 완료(completed) 처리

---

### FR-006: 서명 거절

| 항목 | 내용 |
|------|------|
| **ID** | FR-006 |
| **제목** | 서명 거절 |
| **우선순위** | 필수 |
| **설명** | 서명자가 계약 내용에 동의하지 않을 경우 거절할 수 있다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 서명 화면에서 거절 버튼 제공 | |
| 2 | 거절 사유 입력 (필수, 최대 1000자) | |
| 3 | 거절 시 계약 상태 → rejected | |
| 4 | 계약 담당자에게 알림 | |

**비즈니스 규칙**:
- 거절 후 해당 계약은 더 이상 서명 불가
- 거절 사유는 감사 로그에 기록

---

### FR-007: 계약 관리 대시보드

| 항목 | 내용 |
|------|------|
| **ID** | FR-007 |
| **제목** | 계약 관리 대시보드 |
| **우선순위** | 필수 |
| **설명** | 로그인 사용자가 자신의 계약 현황을 조회하고 관리한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 상태별 통계 카드 | 전체, 진행중, 완료, 만료 등 |
| 2 | 계약 목록 테이블 | 코드, 제목, 상대방, 상태, 기한, 생성일 |
| 3 | 상태 필터 | 드롭다운 |
| 4 | 키워드 검색 | 제목 기준 |
| 5 | 날짜 범위 필터 | 생성일 기준 |
| 6 | 페이지네이션 | 기본 20건 |
| 7 | 상태 배지 색상 구분 | 초안:회색, 진행:파랑, 완료:녹색, 만료:빨강 |

---

### FR-008: 계약 상세 조회

| 항목 | 내용 |
|------|------|
| **ID** | FR-008 |
| **제목** | 계약 상세 조회 |
| **우선순위** | 필수 |
| **설명** | 개별 계약의 상세 정보, 서명 현황, 감사 로그를 조회한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 계약 기본 정보 표시 | 코드, 제목, 설명, 순서, 기한, 상태 |
| 2 | 서명자별 현황 카드 | 이름, 상태, 인증/서명 시각 |
| 3 | 감사 추적 타임라인 | 시간순 이벤트 목록, IP 포함 |
| 4 | 액션 버튼 동적 표시 | 상태에 따라 발송/리마인더/취소/다운로드/검증 |

---

### FR-009: 계약 취소

| 항목 | 내용 |
|------|------|
| **ID** | FR-009 |
| **제목** | 계약 취소 |
| **우선순위** | 필수 |
| **설명** | 계약 생성자가 진행 중인 계약을 취소한다 |

**비즈니스 규칙**:
- 초안(draft) 또는 대기(pending) 상태에서만 취소 가능
- 완료/만료 상태는 취소 불가
- 취소 시 계약 상태 → cancelled

---

### FR-010: 리마인더 발송

| 항목 | 내용 |
|------|------|
| **ID** | FR-010 |
| **제목** | 서명 리마인더 발송 |
| **우선순위** | 보통 |
| **설명** | 미서명 상태인 서명자에게 리마인드 이메일을 재발송한다 |

**비즈니스 규칙**:
- 대기(pending) 또는 부분서명(partially_signed) 상태에서만 가능
- 다음 서명 순서 서명자에게 발송

---

### FR-011: 문서 다운로드

| 항목 | 내용 |
|------|------|
| **ID** | FR-011 |
| **제목** | 계약 문서 다운로드 |
| **우선순위** | 필수 |
| **설명** | 로그인 사용자가 원본 또는 서명 완료 PDF를 다운로드한다 |

**비즈니스 규칙**:
- 서명 완료 PDF가 있으면 서명본 다운로드
- 없으면 원본 PDF 다운로드
- 다운로드 시 감사 로그 기록

---

### FR-012: 문서 무결성 검증

| 항목 | 내용 |
|------|------|
| **ID** | FR-012 |
| **제목** | 문서 무결성 검증 |
| **우선순위** | 필수 |
| **설명** | 저장된 문서가 업로드 시점과 동일한지 SHA-256 해시로 검증한다 |

**상세 요구사항**:

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 원본 PDF 해시 검증 | 업로드 시 저장된 해시와 현재 파일 해시 비교 |
| 2 | 서명 완료 PDF 해시 검증 | |
| 3 | 검증 결과 표시 | 무결성 확인/위변조 감지 |
| 4 | hash_equals() 사용 | 타이밍 공격 방지 |

---

## 4. 비기능 요구사항

### NFR-001: 보안

| # | 요구사항 | 상세 |
|---|---------|------|
| 1 | 접근 토큰 | 128자 랜덤 문자열, URL-safe |
| 2 | OTP 보안 | 6자리, 5분 유효, 5회 제한 |
| 3 | 파일 무결성 | SHA-256 해시 생성 및 검증 |
| 4 | 감사 추적 | 모든 행위 기록, 삭제 불가 |
| 5 | IP/UA 기록 | 서명 시점의 네트워크 정보 기록 |
| 6 | HTTPS 통신 | 모든 API 호출은 HTTPS |
| 7 | 파일 접근 제어 | 직접 URL 접근 불가, Controller 스트리밍만 허용 |

### NFR-002: 성능

| # | 요구사항 | 기준 |
|---|---------|------|
| 1 | PDF 업로드 | 20MB 이하, 10초 이내 |
| 2 | API 응답 시간 | 일반 조회 500ms 이내 |
| 3 | 목록 페이지네이션 | 기본 20건, 1초 이내 |
| 4 | OTP 발송 | 요청 후 30초 이내 이메일 도착 |

### NFR-003: 가용성

| # | 요구사항 | 기준 |
|---|---------|------|
| 1 | 서명 링크 유효 기간 | 계약 만료일까지 |
| 2 | 서명 세션 | 인증 후 유지 (별도 만료 없음) |
| 3 | 동시 접속 | 동일 계약에 여러 서명자 동시 접근 가능 |

### NFR-004: 호환성

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 브라우저 지원 | Chrome, Edge, Safari, Firefox 최신 2버전 |
| 2 | 모바일 지원 | 반응형 UI, 터치 서명 |
| 3 | PDF 렌더링 | PDF.js 기반 클라이언트 렌더링 |

### NFR-005: 법적 요건

| # | 요구사항 | 전자서명법 조항 |
|---|---------|---------------|
| 1 | 서명자 확인 | 이메일 OTP 본인인증 (제2조) |
| 2 | 서명 의사 확인 | 동의 체크박스 (제2조) |
| 3 | 문서 변경 감지 | SHA-256 해시 비교 (제2조) |
| 4 | 서명 후 변경 불가 | 서명 완료 후 수정 차단 (제2조) |
| 5 | 개인정보 보호 | 수집: 이름, 이메일, IP / 보관: 5년 |

### NFR-006: 멀티테넌트

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 데이터 격리 | tenant_id 기반 글로벌 스코프 |
| 2 | 공개 서명 시 스코프 해제 | withoutGlobalScopes() 사용 |
| 3 | 감사 로그에 tenant_id 포함 | |

### NFR-007: 국제화 (i18n)

| # | 요구사항 | 비고 |
|---|---------|------|
| 1 | 하드코딩 메시지 금지 | `__('message.esign.*')` 패턴 사용 |
| 2 | 성공 메시지 12개 | lang/ko/message.php |
| 3 | 에러 메시지 16개 | lang/ko/error.php |
| 4 | 다국어 확장 가능 | lang/en/ 추가로 영문 지원 |

---

## 5. 사용자 시나리오

### US-001: 계약 생성부터 완료까지 (정상 플로우)

```
사전 조건: 관리자(A)가 MNG에 로그인한 상태

1. [A] 대시보드에서 "새 계약" 클릭
2. [A] 계약 정보 입력 + PDF 업로드 + 서명자 정보 입력 → "계약 생성"
3. [A] 서명 위치 지정 화면에서 갑/을 서명란 배치 → "저장"
4. [A] 서명 요청 발송 확인 → "발송"
5. [시스템] 상대방(B)에게 서명 요청 이메일 발송
6. [B] 이메일의 서명 링크 클릭 → 본인인증 화면
7. [B] "인증 코드 발송" 클릭 → 이메일로 OTP 수신
8. [B] 6자리 OTP 입력 → "인증 확인"
9. [B] 서명 화면에서 PDF 확인 → 동의 체크 → 서명 입력 → "서명 제출"
10. [시스템] B 서명 완료 → A에게 서명 알림 발송
11. [A] 동일한 OTP 인증 절차 수행
12. [A] 서명 수행 → "서명 제출"
13. [시스템] 양쪽 서명 완료 → 계약 상태 "completed" → 양쪽에 완료 알림
```

**사후 조건**: 계약 상태 = completed, 양쪽 서명 이미지 저장됨, 감사 로그 기록됨

---

### US-002: 서명 거절

```
사전 조건: 서명자(B)가 OTP 인증까지 완료한 상태

1. [B] 서명 화면에서 "거절" 클릭
2. [B] 거절 사유 입력 → 확인
3. [시스템] B 상태 → rejected, 계약 상태 → rejected
4. [시스템] A에게 거절 알림 발송
5. [B] 거절 완료 화면 표시
```

---

### US-003: 리마인더 발송

```
사전 조건: 계약이 pending 상태, 서명자(B)가 미서명

1. [A] 대시보드에서 해당 계약 클릭 → 상세 화면
2. [A] "리마인더" 버튼 클릭
3. [시스템] B에게 서명 요청 이메일 재발송
4. [시스템] 감사 로그에 "reminded" 기록
```

---

### US-004: 계약 취소

```
사전 조건: 계약이 draft 또는 pending 상태

1. [A] 상세 화면에서 "취소" 버튼 클릭
2. [시스템] 계약 상태 → cancelled
3. [시스템] 감사 로그에 "cancelled" 기록
```

---

## 6. 상태 전이 규칙

### 6.1 계약 상태

| 현재 상태 | 이벤트 | 다음 상태 |
|----------|--------|----------|
| - | 계약 생성 | draft |
| draft | 서명 요청 발송 | pending |
| draft | 취소 | cancelled |
| pending | 첫 서명 완료 | partially_signed |
| pending | 취소 | cancelled |
| pending | 거절 | rejected |
| pending | 기한 초과 | expired |
| partially_signed | 모든 서명 완료 | completed |
| partially_signed | 거절 | rejected |
| partially_signed | 기한 초과 | expired |

**변경 불가 상태**: completed, expired, cancelled, rejected

### 6.2 서명자 상태

| 현재 상태 | 이벤트 | 다음 상태 |
|----------|--------|----------|
| - | 서명자 생성 | waiting |
| waiting | 이메일 발송 | notified |
| notified | OTP 인증 완료 | authenticated |
| authenticated | 서명 완료 | signed |
| notified/authenticated | 거절 | rejected |

---

## 7. 데이터 요구사항

### 7.1 주요 엔티티

| 엔티티 | 테이블명 | 설명 |
|--------|---------|------|
| 계약 | esign_contracts | 계약 마스터 정보 |
| 서명자 | esign_signers | 서명자 정보 및 인증/서명 상태 |
| 서명 필드 | esign_sign_fields | PDF 위의 서명 위치 정보 |
| 감사 로그 | esign_audit_logs | 모든 행위 기록 (삭제 불가) |

### 7.2 데이터 보관 규칙

| 데이터 | 보관 기간 | 근거 |
|--------|----------|------|
| 계약 정보 | 5년 | 전자상거래법 |
| 서명 이미지 | 5년 | 전자상거래법 |
| 감사 로그 | 영구 | 법적 증거력 확보 |
| PDF 파일 | 5년 | 전자상거래법 |

### 7.3 관계

```
esign_contracts (1) ─── (N) esign_signers
       │                        │
      (1)                      (1)
       │                        │
      (N)                      (N)
esign_sign_fields         esign_audit_logs
```

---

## 8. 인터페이스 요구사항

### 8.1 화면 목록

| # | 화면ID | 화면명 | 경로 | 접근 권한 |
|---|--------|--------|------|----------|
| 1 | ES_DASH | 계약 대시보드 | /esign | 로그인 필요 |
| 2 | ES_CREATE | 새 계약 생성 | /esign/create | 로그인 필요 |
| 3 | ES_DETAIL | 계약 상세 | /esign/{id} | 로그인 필요 |
| 4 | ES_FIELDS | 서명 위치 지정 | /esign/{id}/fields | 로그인 필요 |
| 5 | ES_SEND | 서명 요청 발송 | /esign/{id}/send | 로그인 필요 |
| 6 | ES_AUTH | 본인인증 (OTP) | /esign/sign/{token} | 공개 (토큰) |
| 7 | ES_SIGN | 전자서명 수행 | /esign/sign/{token}/sign | 공개 (토큰) |
| 8 | ES_DONE | 서명 완료 | /esign/sign/{token}/done | 공개 (토큰) |

### 8.2 API 목록

**인증 필요 (10개)**:

| Method | 엔드포인트 | 설명 |
|--------|-----------|------|
| GET | /api/v1/esign/contracts | 계약 목록 |
| POST | /api/v1/esign/contracts | 계약 생성 |
| GET | /api/v1/esign/contracts/stats | 통계 |
| GET | /api/v1/esign/contracts/{id} | 상세 |
| POST | /api/v1/esign/contracts/{id}/cancel | 취소 |
| POST | /api/v1/esign/contracts/{id}/fields | 필드 설정 |
| POST | /api/v1/esign/contracts/{id}/send | 발송 |
| POST | /api/v1/esign/contracts/{id}/remind | 리마인더 |
| GET | /api/v1/esign/contracts/{id}/download | 다운로드 |
| GET | /api/v1/esign/contracts/{id}/verify | 검증 |

**토큰 기반 (6개)**:

| Method | 엔드포인트 | 설명 |
|--------|-----------|------|
| GET | /api/v1/esign/sign/{token} | 계약 정보 |
| POST | /api/v1/esign/sign/{token}/otp/send | OTP 발송 |
| POST | /api/v1/esign/sign/{token}/otp/verify | OTP 검증 |
| GET | /api/v1/esign/sign/{token}/document | PDF 조회 |
| POST | /api/v1/esign/sign/{token}/submit | 서명 제출 |
| POST | /api/v1/esign/sign/{token}/reject | 거절 |

### 8.3 이메일 템플릿

| 이메일 | 발송 시점 | 수신자 |
|--------|----------|--------|
| 서명 요청 | 서명 발송/리마인더 시 | 다음 서명자 |
| OTP 코드 | OTP 발송 요청 시 | 서명자 본인 |

---

## 9. 제약사항

| # | 제약사항 | 영향 |
|---|---------|------|
| 1 | SAM 기존 DB 공유 | esign_ 접두사로 테이블명 충돌 방지 |
| 2 | 마이그레이션은 API 프로젝트에서만 | MNG에서 마이그레이션 생성 금지 |
| 3 | 메뉴 시더 실행 금지 | tinker 명령어로 수동 추가 |
| 4 | Docker 환경 | 모든 artisan 명령은 docker exec 사용 |
| 5 | PDF만 지원 | 워드/한글 문서는 PDF 변환 후 사용 |
| 6 | 2인 서명만 | v1에서 3인 이상 미지원 |
| 7 | React 하이브리드 | CDN + Babel 브라우저 트랜스파일링 |

---

## 10. 용어 정의

| 용어 | 정의 |
|------|------|
| 갑 (Creator) | 계약서를 생성하고 서명을 요청하는 당사자 |
| 을 (Counterpart) | 이메일 링크를 통해 서명하는 상대방 |
| OTP | One-Time Password, 일회용 인증 코드 |
| 감사 로그 (Audit Trail) | 계약 관련 모든 행위의 시간순 기록 |
| 접근 토큰 (Access Token) | 서명 링크에 포함되는 128자 고유 식별자 |
| 세션 토큰 (Session Token) | OTP 인증 후 발급되는 서명 세션 식별자 |
| 서명 필드 (Sign Field) | PDF 위에 배치되는 서명/텍스트/날짜 입력 영역 |
| 순차 서명 | 지정된 순서대로 한 명씩 서명하는 방식 |

---

## 11. 변경 이력

| 버전 | 날짜 | 작성자 | 변경 내용 |
|------|------|--------|----------|
| v1.0 | 2026-02-12 | DX 추진팀 | 초기 작성 (구현 완료 기준) |

---

## 12. 관련 문서

| 문서 | 경로 |
|------|------|
| 기술 설계서 | [technical-design.md](./technical-design.md) |
| 구현 가이드 | [implementation-guide.md](./implementation-guide.md) |
| 스토리보드 | [esign-storyboard.pptx](./esign-storyboard.pptx) |

---

*본 요구사항 정의서는 SAM E-Sign v1.0의 구현 결과를 기반으로 작성되었습니다.*
