- Handler.php: API 라우트는 Accept 헤더 없어도 JSON 응답 반환 - ApiKeyMiddleware: 요청 로그에 헤더 정보 추가 (X-API-KEY, Authorization 마스킹) - Route [login] not defined 에러 해결 - 인증 실패 시 401 JSON 응답으로 일관성 확보
152 lines
5.3 KiB
Markdown
152 lines
5.3 KiB
Markdown
# SAM API 작업 현황
|
|
|
|
## 2025-11-25 (월) - API 인증 에러 처리 개선 및 요청 로그 강화
|
|
|
|
### 문제 상황
|
|
- GET /item-master/init 요청 시 `Route [login] not defined` 에러 발생
|
|
- user_id null (인증 실패 상태)
|
|
- API Request 로그에 헤더 정보 누락
|
|
|
|
### 근본 원인
|
|
1. **Handler.php**: `expectsJson()` 체크만 있어서, Accept 헤더 없는 API 요청이 기본 동작(로그인 리다이렉트)으로 처리됨
|
|
2. **ApiKeyMiddleware**: 요청 로그에 헤더 정보 (X-API-KEY, Authorization) 미포함
|
|
|
|
### 해결 방안
|
|
|
|
**Handler.php (app/Exceptions/Handler.php)**
|
|
- Line 60: API 라우트 체크 추가 (`str_starts_with($request->path(), 'api/')`)
|
|
- Line 62: `$request->expectsJson() || $isApiRoute` 조건으로 변경
|
|
- 효과: Accept 헤더 없어도 API 라우트는 무조건 JSON 응답 반환
|
|
|
|
**ApiKeyMiddleware (app/Http/Middleware/ApiKeyMiddleware.php)**
|
|
- Line 52-57: headers 필드 추가
|
|
- X-API-KEY: 마스킹 ('***')
|
|
- Authorization: Bearer 토큰 마스킹 ('Bearer ***')
|
|
- Accept, Content-Type: 원본 그대로
|
|
- 효과: 인증 문제 디버깅 용이
|
|
|
|
### 수정된 파일
|
|
- `app/Exceptions/Handler.php`
|
|
- `app/Http/Middleware/ApiKeyMiddleware.php`
|
|
|
|
### 검증 결과
|
|
- PHP 문법 체크: ✅ 통과
|
|
- Pint 코드 포맷팅: ✅ 통과
|
|
|
|
### 기대 효과
|
|
1. API 요청 시 Accept 헤더 없어도 정상 JSON 응답
|
|
2. 인증 실패 시 로그인 리다이렉트 대신 401 JSON 응답
|
|
3. 요청 로그에서 헤더 정보 확인 가능 (디버깅 개선)
|
|
|
|
---
|
|
|
|
## 2025-11-24 (일) - 소프트삭제 및 타임스탬프 감사 컬럼 추가
|
|
|
|
### 작업 목표
|
|
- deleted_at이 있는 테이블에 deleted_by 컬럼 추가
|
|
- created_at, updated_at이 있는 테이블에 created_by, updated_by 컬럼 추가
|
|
|
|
### 작업 내용
|
|
|
|
**1. DB 스키마 분석 (INFORMATION_SCHEMA 쿼리)**
|
|
- deleted_at은 있지만 deleted_by가 없는 테이블: 30개
|
|
- created_at은 있지만 created_by, updated_by가 없는 테이블: 45개
|
|
|
|
**2. 마이그레이션 생성**
|
|
- `2025_11_24_192518_add_deleted_by_to_soft_delete_tables.php`
|
|
- 30개 테이블에 deleted_by 추가
|
|
- nullable, COMMENT('삭제자 사용자 ID')
|
|
- after('deleted_at') 배치
|
|
|
|
- `2025_11_24_192518_add_audit_columns_to_tables.php`
|
|
- 38개 비즈니스 테이블에 created_by, updated_by 추가
|
|
- 시스템 테이블 제외 (jobs, job_batches, password_reset_tokens, personal_access_tokens, taggables, tags)
|
|
- nullable, COMMENT
|
|
- after('updated_at'), after('created_by') 배치
|
|
|
|
**3. 마이그레이션 실행 및 검증**
|
|
- 실행 시간: deleted_by (429.53ms), audit_columns (1초)
|
|
- 샘플 테이블 검증: users, products, models, bom_templates, department_user 모두 정상
|
|
|
|
### 추가된 파일
|
|
- `database/migrations/2025_11_24_192518_add_deleted_by_to_soft_delete_tables.php`
|
|
- `database/migrations/2025_11_24_192518_add_audit_columns_to_tables.php`
|
|
|
|
### 마이그레이션 상태
|
|
- Batch 25로 실행 완료
|
|
- 롤백 가능 (down 메서드 구현)
|
|
|
|
---
|
|
|
|
## 2025-11-24 (일) - CORS Preflight 문제 해결
|
|
|
|
### 문제 상황
|
|
- React 프론트엔드(http://192.0.0.2:3001)에서 API 호출 시 CORS 에러
|
|
- 에러: `Request header field x-api-key is not allowed by Access-Control-Allow-Headers in preflight response`
|
|
- 서버 로그: OPTIONS 요청만 있고 Response 로그 없음 (401 차단)
|
|
|
|
### 근본 원인 (root-cause-analyst 스킬 활용)
|
|
1. CorsMiddleware에서 `Access-Control-Allow-Headers`에 `X-API-KEY` 누락
|
|
2. OPTIONS 요청(Preflight)이 ApiKeyMiddleware에서 401로 차단
|
|
3. 브라우저는 커스텀 헤더 사용 시 Preflight 요청을 자동 전송
|
|
|
|
### 해결 방안
|
|
|
|
**CorsMiddleware 수정:**
|
|
- OPTIONS 요청을 미들웨어 체인 진입 전에 즉시 200 OK 처리
|
|
- `Access-Control-Allow-Headers`에 `X-API-KEY` 추가
|
|
- PATCH 메서드 추가, Max-Age 86400초 설정
|
|
|
|
**ApiKeyMiddleware 정리:**
|
|
- 불필요한 OPTIONS 체크 제거
|
|
|
|
**CORS 설정 업데이트:**
|
|
- `config/cors.php`: exposed_headers, max_age 설정
|
|
|
|
### 수정된 파일
|
|
- `app/Http/Middleware/CorsMiddleware.php`
|
|
- `app/Http/Middleware/ApiKeyMiddleware.php`
|
|
- `config/cors.php`
|
|
|
|
### Git 커밋
|
|
- `2e96660` - CORS preflight 요청 처리 개선 및 X-API-KEY 헤더 허용
|
|
- `8e8ab65` - CORS preflight 응답에 x-api-key 헤더 허용 추가
|
|
|
|
### 다음 작업
|
|
- React에서 API 호출 테스트
|
|
- 개발 서버 로그 확인 (Request/Response 쌍 기록 여부)
|
|
|
|
---
|
|
|
|
## 2025-11-20 (수) - ItemMaster API 테스트 및 버그 수정
|
|
|
|
### 주요 작업
|
|
- ItemMaster API 통합 테스트 작성 (12개 테스트, 82개 assertion)
|
|
- 누락된 마이그레이션 실행 (section_templates, tab_columns)
|
|
- API Key 미들웨어 수정 (로그인 엔드포인트 API Key 필수화)
|
|
- ReorderRequest validation 수정 (범용성 확보)
|
|
- 네임스페이스 오류 수정 (5개 Controller)
|
|
- Route 순서 수정 (specific route 우선)
|
|
|
|
### 테스트 결과
|
|
✅ 12/12 테스트 통과 (100%)
|
|
|
|
---
|
|
|
|
## 2025-11-19 (화) - ItemMaster API Swagger 문서 작성
|
|
|
|
### 주요 작업
|
|
- ItemMaster 전체 API (32개 엔드포인트) Swagger 문서화 완료
|
|
- OpenAPI 3.0 표준 준수
|
|
- Model Schemas 8개, Request Schemas 12개 작성
|
|
|
|
---
|
|
|
|
## 2025-11-18 (월) - Category API 테스트 및 개선
|
|
|
|
### 주요 작업
|
|
- Category CRUD 테스트 작성 (9개 테스트, 98개 assertion)
|
|
- 계층 구조 및 필드 관리 테스트
|
|
- Validation 로직 개선
|
|
|
|
--- |