Add network protection and administrator account support

This commit is contained in:
2026-10-15 12:05:52 +09:00
parent 471e2653d8
commit 4d527f74e6
20 changed files with 2913 additions and 106 deletions

View File

@@ -199,3 +199,14 @@
- 전송 선택·수신 요청·보관함·관리자·텍스트 한도 안내를 공통 KB/MB/GB(1,000 단위) 표시로 바꿨다. 1MB 미만은 KB, 1MB/1GB 경계에서만 단위를 바꾸며 `938KB`, `1.1MB`, `1.7GB`로 표시한다. 0은 0KB, 1KB 미만은 별도로 안내한다. 저장 한도와 환경변수의 기존 MiB 기준은 유지하고, 관리자 전체 용량 입력은 GB로 환산했다. 반올림된 표시를 수정하지 않고 다른 규칙만 저장해도 원래 설정 용량이 바뀌지 않는 브라우저 검증을 추가했다.
- 관리자에게 계정별 보관함·기기 세션별 업로드·기기 전체 업로드·파일당 한도·NAS 최소 여유 공간의 실제 서버 설정값을 제공한다. 전체 한도는 사용자 모두의 원본·예약 합계이며 개인 배정량이 아님을 설명한다. 한도 부족 시 새 업로드 거절, 보관함이 가득 차면 수신/다운로드 후 기록 생략, 기존 자료 유지도 구분했다.
- API 126개와 한도 API 검증을 포함한 관리자 9개, 전체 빌드·타입 검사·포맷 검사를 통과했다. 실제 Chromium의 관리자 PC/390px 모바일·이름 대괄호/만료일·수신 KB/MB/GB·보관함·12기기 레이아웃/푸터 회귀 검증을 통과했다. 운영 Docker에서 새 테이블 마이그레이션과 재시작 후 파일별 접속 기록, 관리자 설정, 파일/Unicode 텍스트·계정 세션·8MiB 조각 재개·SQLite integrity·바인드 파일 수동 삭제를 검증했다. 격리 테스트 자원만 사용했으며 NAS 운영 자료·Compose 파일은 변경하거나 재배포하지 않았다.
## 2026-10-15 네트워크 보호·관리 기록 정리·사용자 지원
- 국가를 `일본(JP)`처럼 코드와 함께 표시한다. 관리자 탭을 저장 파일/용량 설정/네트워크/사용자/관리 기록으로 나누고 네트워크에 자동 블랙리스트·수동 블랙리스트·화이트리스트를 배치했다. 국가/IP/IPv4·IPv6 CIDR은 모달 검증 후 한 항목씩 표에 추가하며 선택 제거와 명시적 저장을 제공한다. 기존 저장된 수동 차단 규칙과 리비전은 보존하고 새 자동 기능은 꺼짐·화이트리스트는 빈 값으로 시작한다.
- 화이트리스트는 비어 있으면 공개, 등록된 국가 또는 IP/대역과 일치하면 허용하며 블랙리스트·자동 차단이 우선한다. 국가 미제공은 허용 IP와 일치하지 않으면 제외한다. IPv6·매핑 IPv4·원본 헤더 신뢰·관리자 자신을 차단하는 규칙 거절과 기존/새 WebSocket 접속의 제외를 확인했다. 국가만 허용해도 컨테이너 내부의 전달 헤더 없는 루프백 health 검사는 유지하고 외부 health 요청은 동일 정책으로 제한한다.
- 자동 보호는 원본 공인 IP별 로그인 실패·일반 요청 제한 반복 위반·파일 전송 시도 횟수/선언 용량을 감지한다. 기본 10분 창, 실패 10회·위반 20회·파일 시도 30회 초과/10GB 초과·30분 차단이며 관리자에서 수정한다. 기기 쿠키 교체 및 로그인 보관함/기기 전송이 같은 IP 예산을 공유하고 동일 요청 키 재시도는 중복 계산하지 않음을 확인했다. 정상 조각 API·혼잡·거절 대기는 위반으로 세지 않으며 미확인 프록시를 자동 차단하지 않는다. 자동 목록의 재시작 유지·만료·수동 해제/누적 초기화·해제 뒤 접근·끄기/다시 켜기를 검증했다. 기존 검증 관리자 세션은 자동 차단 복구만 가능하고 수동 규칙은 우회하지 않는다.
- 관리 기록은 전체 설정을 반복하지 않고 실제 전/후 값과 목록 추가/제거만 저장한다. 값이 같은 저장은 로그를 추가하지 않는다. 과거 기록은 비교 가능한 이전 정보가 있을 때만 차이를 표시한다. 읽음 상태는 추가하지 않았으며 개별/선택/전체 삭제와 전체 삭제 확인을 구현했다. 로그를 삭제해도 설정·자동 차단·파일에 영향이 없고 일반 계정은 조회/삭제할 수 없음을 확인했다.
- 사용자 목록은 이메일/이름/상태·마지막 활동·국가/지역/IP만 관리자에게 제공하며 비밀번호 해시·세션·토큰을 반환하지 않는다. 같은 정보의 1분 내 쓰기 억제, 30일 뒤 위치/IP 제거와 마지막 시간 유지, 과거 지역 추정 없음·일반 사용자 접근 거절을 검증했다. 사용자 더보기에서 테스트 메일로 기존 일회용 재설정 링크를 발급하고 수신자의 완료 전 비밀번호 유지·완료 후 이전 세션 폐기·링크 재사용 거절을 확인했다.
- 계정 삭제는 이메일 확인·관리자 보호·일반 계정 거절을 적용하고 개인정보/자격 증명 익명화·세션/토큰 폐기·보관함 접근권 제거·대기 중 계정 전송 취소를 수행한다. 다른 수신자가 참조하는 실제 파일은 삭제하지 않고 다운로드가 유지된다. 비밀번호 검증 중 계정 삭제와 겹쳐도 로그인 성공 세션을 발급하지 않도록 최신 상태를 다시 확인한다. 사용자 기능은 평소 더보기 안에만 표시한다.
- API 전체 139개와 마지막 내부 health 예외를 포함한 네트워크 8개·전체 빌드/타입 검사·포맷 검사를 통과했다. 실제 Chromium에서 네트워크 모달/선택 제거·화이트리스트·로그인 실패 자동 차단 목록/해제·국가 코드 표시·변경 기록 선택/전체 삭제·사용자 더보기 재설정/삭제와 PC/390px 모바일을 확인했다. 기존 계정 가입/인증/보관함·일반 텍스트/링크/파일 전송의 브라우저 회귀도 통과했다.
- 최종 운영 Docker에서 새 테이블 자동 마이그레이션, 화이트리스트·자동 차단 IP·사용자 접속·변경 필드 기록의 재시작 보존, 기존 계정 쿠키·자료·Unicode 텍스트·8MiB 부분 조각 이어 보내기·SQLite integrity·호스트 바인드 수동 삭제를 확인했다. 실제 Resend 메일과 NAS 운영 데이터·Cloudflare 설정은 사용하지 않고 격리 자원/메일 대역으로 검증했다. 운영 `docker-compose.yaml`은 변경하지 않았다.