{"id":31122761,"url":"https://github.com/minhi0449/file-extension-blocker","last_synced_at":"2026-02-13T20:02:31.185Z","repository":{"id":311316262,"uuid":"1043324161","full_name":"minhi0449/file-extension-blocker","owner":"minhi0449","description":"파일 확장자 차단 프로그램 / Java, Spring Boot, JPA, MySQL ","archived":false,"fork":false,"pushed_at":"2025-08-24T13:41:08.000Z","size":116,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-17T17:45:57.732Z","etag":null,"topics":["aws","file-extension-blocker","file-security","file-upload","github-actions","java","mysql","spring-boot","spring-data-jpa","thymeleaf"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/minhi0449.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-08-23T16:03:03.000Z","updated_at":"2025-08-26T12:44:37.000Z","dependencies_parsed_at":"2025-08-24T07:26:29.458Z","dependency_job_id":"01737ba3-5a7f-46e1-b09a-4310554e793b","html_url":"https://github.com/minhi0449/file-extension-blocker","commit_stats":null,"previous_names":["minhi0449/file-extension-blocker"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/minhi0449/file-extension-blocker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minhi0449%2Ffile-extension-blocker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minhi0449%2Ffile-extension-blocker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minhi0449%2Ffile-extension-blocker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minhi0449%2Ffile-extension-blocker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/minhi0449","download_url":"https://codeload.github.com/minhi0449/file-extension-blocker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/minhi0449%2Ffile-extension-blocker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29416040,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-13T06:24:03.484Z","status":"ssl_error","status_checked_at":"2026-02-13T06:23:12.830Z","response_time":78,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws","file-extension-blocker","file-security","file-upload","github-actions","java","mysql","spring-boot","spring-data-jpa","thymeleaf"],"created_at":"2025-09-17T17:04:11.419Z","updated_at":"2026-02-13T20:02:31.180Z","avatar_url":"https://github.com/minhi0449.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 파일 확장자 차단 (File Extension Blocker)\n\u003e **개발 날짜 : 2025. 08. 24** \u003c/br\u003e\n\u003e url : http://13.209.67.184:8080/block **\u003c/br\u003e**\n보안 위험이 높은 실행형 파일(exe, sh 등)의 업로드를 방지하기 위한 Spring Boot 3 + JPA 기반 정책 관리/검증 서비스입니다. \n관리 화면에서 고정 확장자(체크박스)와 커스텀 확장자(칩 UI)를 관리하며, 업로드 시 서버 단 최종 검증으로 차단합니다.\n\n## 사용 기술 (Tech Stack)\n| 분야 | 스택 |\n|----|------|\n| **Backend** | ![Java 17](https://img.shields.io/badge/Java%2017-007396?style=flat\u0026logo=java\u0026logoColor=white) ![Spring Boot 3](https://img.shields.io/badge/Spring%20Boot%203-6DB33F?style=flat\u0026logo=spring-boot\u0026logoColor=white) ![Spring Data JPA](https://img.shields.io/badge/Spring%20Data%20JPA-59666C?style=flat) |\n| **Frontend** | ![Thymeleaf](https://img.shields.io/badge/Thymeleaf-005F0F?style=flat\u0026logo=thymeleaf\u0026logoColor=white) ![HTML5](https://img.shields.io/badge/HTML5-E34F26?style=flat\u0026logo=html5\u0026logoColor=white) ![CSS3](https://img.shields.io/badge/CSS3-1572B6?style=flat\u0026logo=css3\u0026logoColor=white) ![JavaScript ES6](https://img.shields.io/badge/JavaScript%20ES6-F7DF1E?style=flat\u0026logo=javascript\u0026logoColor=black) |\n| **Database** | ![MySQL 8](https://img.shields.io/badge/MySQL%208-4479A1?style=flat\u0026logo=mysql\u0026logoColor=white) |\n| **DevOps** | ![GitHub Actions](https://img.shields.io/badge/GitHub%20Actions-2088FF?style=flat\u0026logo=github-actions\u0026logoColor=white) ![AWS EC2 \\| RDS \\| S3](https://img.shields.io/badge/AWS%20(EC2%20%7C%20RDS%20%7C%20S3)-F7931E?style=flat\u0026logo=amazon-aws\u0026logoColor=white) |\n\n## 프로젝트 하이라이트\n| 구분 | 요약 |\n|---|---|\n| **핵심 기능** | 고정 확장자 차단 토글, 커스텀 확장자 추가/삭제, 업로드 시 차단 여부 판정 및 이력 저장 |\n| **아키텍처** | Controller – Service – Repository – Entity 4계층 구조, 설정값 바인딩(ConfigurationProperties) |\n| **검증 전략** | 프론트 1차 필터링 + **서버 최종 검증(권한자)** 로 보안 우회 방지 |\n| **사용성** | 칩 UI로 추가/삭제 직관적 관리, 새로고침 시 상태 유지(DB 반영) |\n| **관측성** | 업로드 이력 저장(허용/차단, 시간), Hibernate SQL 로그 트레이싱 |\n\n---\n\n## 요구사항\n- **1-1. 고정 확장자**: 자주 차단하는 확장자 리스트. 기본 **unchecked**.  \n- **1-2. 고정 확장자 토글**: 체크/해제 시 **DB 저장**되며, 새로고침 후에도 유지.  \n  *(커스텀 영역에는 표시되지 않음)*  \n- **2-1. 커스텀 확장자 입력 길이**: **최대 20자**  \n- **2-2. 추가 버튼 클릭 시**: **DB 저장** 후 화면 아래 칩 영역에 렌더  \n- **3-1. 커스텀 확장자 최대 개수**: **최대 200개**  \n- **3-2. 칩의 X 클릭 시**: **DB에서 삭제** 및 화면 제거\n\n## 추가로 고려한 점\n- **커스텀 확장자 중복 체크**  \n  이미 존재하는 값은 DB/화면에 중복 저장되지 않도록 차단.\n- **서버단 최종 검증**  \n  프론트에서 먼저 막더라도 업로드 시 **서버(`FileUploadService.isFileUploadAllowed`)**가  \n  고정/커스텀 정책을 재확인하여 **최종 차단 여부** 결정.\n- **정규화(Normalization)**  \n  비교 전 소문자 처리 + 선행 `.` 제거로 `.EXE`, `Exe`, `.exe` 등 모두 동일하게 취급.\n- **고정 확장자 중복 금지**  \n  커스텀 추가 시 고정 확장자 목록과 **중복 불가**.\n- **업로드 이력(Audit Trail)**  \n  `upload_history` 테이블에 파일명/확장자/허용여부/시간 저장 → 사후 추적·통계 가능.\n- **화이트리스트 전환 고려**  \n  현재는 블랙리스트(차단 리스트) 방식이지만, 서비스 레이어 분리로 화이트리스트 전환 용이.\n\n\n\u003cimg width=\"1066\" height=\"611\" alt=\"파일 확장자 차단\" src=\"https://github.com/user-attachments/assets/53e9684d-fb03-490c-a6f3-74cf9befc252\" /\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminhi0449%2Ffile-extension-blocker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fminhi0449%2Ffile-extension-blocker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fminhi0449%2Ffile-extension-blocker/lists"}