인증 요청 안정화와 월간 메일 한도 적용

This commit is contained in:
2026-06-25 14:05:23 +09:00
parent 35a2976182
commit 5fbd58bd07
20 changed files with 350 additions and 30 deletions

View File

@@ -1,5 +1,23 @@
# 변경사항
## v4.0.14
### 계정별 이메일 발송 한도
가입 인증과 비밀번호 재설정 메일은 계정당 한 달에 최대 3회까지 받을 수 있습니다.
한도를 초과한 경우 다음 달에 다시 요청하거나 `zenn@sori.studio`로 문의해 주세요.
## v4.0.13
### 이메일 인증 오류 수정
이메일의 인증 버튼을 눌렀을 때 일부 브라우저에서 구버전 파일이 남아 인증되지 않던 문제를 수정했습니다.
### 인증 화면 중복 요청 방지
회원가입, 로그인, 이메일 전송과 비밀번호 변경 처리 중에는 버튼에 진행 상태를 표시하고 반복 제출을 차단합니다. 메일 재전송은 60초 후 다시 요청할 수 있습니다.
## v4.0.12
### 이메일 인증 회원가입

View File

@@ -75,7 +75,7 @@ Docker 실행: `docker compose -f docker-compose.prod.yml up -d --build`
API 확인: `curl -fsS http://localhost:44082/api/v1/health`
정상이면 `{"ok":true,"version":"4.0.12"}`이 표시된다.
정상이면 `{"ok":true,"version":"4.0.14"}`이 표시된다.
이메일 기능 확인:
@@ -83,6 +83,7 @@ API 확인: `curl -fsS http://localhost:44082/api/v1/health`
2. 인증 메일 링크를 누르기 전 로그인이 차단되는지 확인한다.
3. 인증 후 로그인되는지 확인한다.
4. 로그인 화면의 `비밀번호를 잊으셨나요?`에서 재설정 메일과 새 비밀번호 로그인을 확인한다.
5. 같은 계정에서 인증·재설정 메일을 합산해 월 3회 초과 시 관리자 문의 안내가 표시되는지 확인한다.
NAS 리버스 프록시는 `https://uniare.sori.studio`을 `http://<NAS_IP>:44082`로 연결한다.

View File

@@ -1,5 +1,15 @@
# 의사결정 이력
## 2026-06-25 v4.0.14 — 계정별 자동 메일은 월 3회로 제한
💡 무료 메일 한도를 소수 계정의 반복 요청이 소진하지 않도록 보호하기 위함.
🔧 한국 시간 월 기준으로 인증·재설정 메일을 합산하고, 4회째부터 관리자 이메일 문의를 안내.
## 2026-06-25 v4.0.13 — 인증 요청은 화면 잠금과 서버 제약을 함께 적용
💡 메일 전송 지연 중 반복 클릭과 정적 API 클라이언트 캐시 불일치를 동시에 방지하기 위함.
🔧 인증 JS에 버전 쿼리·직접 호출 폴백을 적용하고 제출 중 잠금, 스피너, 메일 60초 재요청 대기를 표시.
## 2026-06-25 v4.0.12 — 신규 가입부터 이메일 소유 확인 적용
💡 기존 회원을 잠그지 않으면서 허위 이메일 가입과 관리자 의존 비밀번호 초기화를 막기 위함.

View File

@@ -50,6 +50,9 @@ nginx/uadeck.conf
API 요청
script/api.js
인증 폼 로딩·중복 제출 잠금·메일 재요청 대기
script/auth-form.js
인증 헤더
script/auth-header.js
style/components.css (@layer components)
@@ -116,6 +119,9 @@ api/src/index.js
SQLite 스키마·관리자 시드
api/src/db.js
계정별 월간 이메일 발송 기록
api/src/db.js (`email_send_logs`)
JWT 인증·권한
api/src/middleware/auth.js

View File

@@ -3,7 +3,7 @@
## 프로젝트 개요
- 서비스명: `UNIARE - Union Arena Deck Builder`
- 현재 버전: `v4.0.12`
- 현재 버전: `v4.0.14`
- 프론트: 정적 HTML, CSS, JavaScript
- 백엔드: Express, SQLite(`better-sqlite3`)
- 운영: Docker Compose 기반 Nginx + API
@@ -92,6 +92,10 @@
- 기존 회원은 이메일 인증 기능 배포 시 인증 완료 상태로 마이그레이션한다.
- 인증 링크는 24시간, 비밀번호 재설정 링크는 30분 동안 한 번만 사용할 수 있다.
- 인증·재설정 원문 토큰은 DB에 저장하지 않고 SHA-256 해시만 저장한다.
- 인증 메일 링크와 인증 화면은 버전 쿼리로 최신 HTML·API 클라이언트를 로드하고, 캐시된 구 클라이언트에서도 직접 인증 API를 호출한다.
- 인증 폼은 요청 중 제출 버튼을 잠그고 로딩 상태를 표시하며, 메일 재요청은 화면과 API에서 1분 간격으로 제한한다.
- 가입 인증·인증 재전송·비밀번호 재설정 메일은 계정별 한국 시간 기준 월 3회까지만 발송한다.
- 월간 한도 초과 시 자동 발송을 중단하고 관리자 이메일 `zenn@sori.studio` 문의를 안내한다.
- 사용자명은 대소문자를 구분하지 않고 중복을 차단한다.
- 인증된 이메일은 프로필에서 직접 변경할 수 없다.
- JWT 기본 만료는 7일이며 `JWT_EXPIRES`로 변경할 수 있다.
@@ -145,6 +149,16 @@
| `expires_at`, `used_at` | 만료·사용 시각 |
| `created_at` | 발급 시각 |
### `email_send_logs`
| 컬럼 | 설명 |
|---|---|
| `user_id` | 발송 대상 사용자 |
| `type` | `verify_email` 또는 `reset_password` |
| `month_key` | 한국 시간 기준 `YYYY-MM` 월 |
| `status` | 동시 요청 방지용 `reserved`, 발송 완료 `sent` |
| `created_at`, `sent_at` | 예약·발송 시각 |
### `decks`
| 컬럼 | 설명 |

View File

@@ -1,5 +1,22 @@
# 업데이트 이력
## 2026-06-25 / v4.0.14 — 계정별 월간 메일 한도
### 수행 작업
- 가입 인증·인증 재전송·비밀번호 재설정 메일을 계정별 월 3회로 통합 제한
- 한국 시간 기준 월별 발송 기록을 `email_send_logs`에 저장
- 동시 요청은 발송 전 횟수를 예약해 월 한도 우회 방지
- Resend 발송 실패 시 예약을 취소해 무료 횟수가 잘못 차감되지 않도록 처리
- 한도 초과 시 `zenn@sori.studio` 관리자 문의 안내 반환
## 2026-06-25 / v4.0.13 — 인증 캐시·중복 제출 방지
### 수행 작업
- 이메일 인증 화면이 캐시된 구 `api.js`를 불러와 `verifyEmail`을 찾지 못하던 문제 수정
- 인증 메일 링크·인증 화면에 `v=4.0.13` 캐시 무효화와 직접 API 호출 폴백 적용
- 회원가입·로그인·인증 메일·비밀번호 찾기·재설정 요청 중 버튼 잠금과 로딩 스피너 표시
- 인증 메일과 비밀번호 재설정 메일 전송 후 60초 재요청 대기 표시
## 2026-06-25 / v4.0.12 — 이메일 인증·비밀번호 재설정
### 수행 작업