From 08f345fad71472af82ce93c7f449c84918684e43 Mon Sep 17 00:00:00 2001 From: qorgh529 Date: Fri, 10 Apr 2026 20:05:08 +0900 Subject: [PATCH] =?UTF-8?q?docs:=202026-04-10=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20README=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 84 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ea23214..33a5ef8 100755 --- a/README.md +++ b/README.md @@ -82,14 +82,37 @@ nginx-portal/ ## ✨ 기능 설명 ### 일반 사용자 -- 로그인 후 **본인에게 할당된 웹페이지 목록** 카드 형태로 확인 +- 로그인 후 **MY Page List** 에서 본인에게 할당된 웹페이지를 카드 형태로 확인 +- 카드의 Favicon 자동 표시 (없을 경우 기본 아이콘) - 카드 클릭 시 **새 탭에서 해당 URL로 이동** +- **공지사항** 탭에서 관리자가 등록한 공지 확인 및 댓글 작성 +- **관리자 요청** 탭에서 게시글 작성 및 답글 작성 +- 로그인 비밀번호 표시/숨김 토글 버튼 +- 로그인 실패 시 아이디 유지 (비밀번호만 초기화) +- **비밀번호 변경** 메뉴 (헤더에서 언제든 변경 가능) +- **최초 로그인 시 비밀번호 강제 변경** (변경 전까지 서비스 이용 불가) +- **비밀번호 5회 오류 시 계정 자동 잠금** → 관리자에게 잠금 해제 요청 필요 ### 관리자 일반 사용자 기능 + 추가: - **페이지 관리**: 웹페이지 추가 / 수정 / 삭제 - **사용자 관리**: 계정 생성 / 삭제 - **권한 설정**: 사용자별 접근 가능 페이지를 체크박스로 지정 +- **비밀번호 변경**: 특정 사용자의 비밀번호 직접 변경 (변경 후 해당 사용자 강제 변경 적용) +- **임시 비밀번호 발급**: 랜덤 임시 비밀번호 자동 생성 후 화면에 표시 +- **계정 잠금 해제**: 잠긴 계정을 버튼 하나로 해제 +- **사용자 상태 확인**: 정상 / 🔒잠김 / 초기PW / 변경요청 태그로 한눈에 확인 +- **공지사항 작성**: 공지 탭에서 전체 사용자에게 공지 등록 / 삭제 + +### 게시판 (공지 / 관리자 요청) + +| 구분 | 공지 | 관리자 요청 | +|------|------|------------| +| 글 작성 | 관리자만 가능 | 모든 사용자 가능 | +| 댓글/답글 | 모든 사용자 가능 | 모든 사용자 가능 | +| 글 삭제 | 관리자만 가능 | 본인 또는 관리자 | +| 댓글 삭제 | 본인 또는 관리자 | 본인 또는 관리자 | +| 목록 항목 | 번호, 제목, 작성자, 작성일(시간포함) | 번호, 제목, 작성자, 작성일(시간포함) | --- @@ -215,6 +238,7 @@ kubectl delete namespace web-portal ## 🔐 운영 시 보안 설정 +### K8s Secret 변경 `k8s/03-secrets.yaml` 에서 반드시 변경: ```yaml stringData: @@ -222,6 +246,27 @@ stringData: jwt-secret: "64자이상의랜덤문자열로변경" ``` +### Nginx Rate Limiting (Brute Force 방어) +`frontend/nginx.conf` 상단에 추가: +```nginx +limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m; +``` +로그인 location에 적용: +```nginx +location /api/auth/login { + limit_req zone=login_limit burst=3 nodelay; + limit_req_status 429; + proxy_pass http://backend-service.web-portal.svc.cluster.local:8000/api/auth/login; + ... +} +``` +같은 IP에서 분당 5회 초과 시 429 응답 반환. 계정 잠금(5회 실패)과 함께 이중으로 Brute Force를 방어합니다. + +### 추가 보안 권고사항 +- **Fail2ban**: Nginx 로그 감시 후 반복 실패 IP를 방화벽으로 자동 차단 (온프레미스 환경 권장) +- **CAPTCHA**: 로그인 3회 실패 시 Google reCAPTCHA 표시 (추가 개발 필요) +- **JWT 만료 시간 단축**: `main.py` 에서 `timedelta(hours=8)` → `timedelta(hours=2)` 변경 가능 + --- ## ❗ 트러블슈팅 @@ -433,3 +478,41 @@ hint: Updates were rejected because the tip of your current branch is behind git pull origin main --rebase git push origin main ``` + +--- + +### 11. git commit 시 Author identity unknown +**증상** +``` +Author identity unknown +fatal: unable to auto-detect email address +``` +**원인** Git 사용자 정보가 설정되지 않은 상태. + +**해결** +```bash +git config --global user.email "계정@gitea.com" +git config --global user.name "계정명" +``` + +--- + +## 📅 변경 이력 + +### 2026-04-06 (초기 구축) +- Kubernetes 환경 구성 (Docker Desktop) +- FastAPI 백엔드 + Nginx 프론트엔드 + PostgreSQL 배포 +- Gitea + ArgoCD GitOps 파이프라인 구성 +- Gitea Container Registry 연동 + +### 2026-04-10 (기능 추가) +- **MY Page**: 탭명/목록 제목 영문 변경, URL 미표기, Favicon 자동 표시 +- **비밀번호 보안 강화** + - 로그인 비밀번호 표시/숨김 토글 버튼 + - 로그인 실패 시 아이디 유지 (비밀번호만 초기화) + - 최초 로그인 시 비밀번호 강제 변경 + - 비밀번호 5회 오류 시 계정 자동 잠금 + - 관리자의 사용자 비밀번호 변경 / 임시 비밀번호 발급 / 잠금 해제 +- **공지사항 탭**: 관리자 작성 전용, 모든 사용자 댓글 가능 +- **관리자 요청 탭**: 게시판 형태, 모든 사용자 작성/답글 가능 +- **Nginx Rate Limiting**: 로그인 API 분당 5회 제한 (Brute Force 방어)