70 lines
3.6 KiB
Markdown
70 lines
3.6 KiB
Markdown
---
|
|
type: concept
|
|
status: stable
|
|
related_pages: ["[[B01_Dashboard/B01_backend]]"]
|
|
last_updated: 2026-07-12
|
|
source: raw/guidelines/backend.md, raw/guidelines/frontend.md, raw/guidelines/agent.md
|
|
---
|
|
|
|
# 인증 / RBAC
|
|
|
|
## 세션 인증 (backend.md 6.3)
|
|
- 방식: Secure HttpOnly 세션 쿠키 (`session_id`, JWT 아님), `SameSite=Lax`
|
|
- 저장소: `sessions` 테이블 → [[db_schema/users_auth]]
|
|
- 유효시간: 활동 기준 4시간 또는 절대 12시간 중 먼저 도달하는 쪽
|
|
- DB 풀: `autocommit=True` (세션 즉시 조회 가능하도록)
|
|
- 프론트: 모든 API 요청에 `credentials: "include"` (frontend.md 5.1)
|
|
|
|
## OTP / 비밀번호
|
|
- OTP 6자리, 5분 유효, 해시 저장(bcrypt/PBKDF2), 재시도 최대 3회(2s/4s/8s 백오프)
|
|
- 비밀번호 최소 8자, bcrypt(라운드≥12) 또는 PBKDF2, 평문 저장 절대 금지
|
|
- 5회 연속 실패 시 계정 15분 잠금
|
|
|
|
## 사용자 상태 생명주기
|
|
```
|
|
PENDING_EMAIL → NO_COMPANY → (PENDING | ACTIVE) → (INACTIVE | REJECTED)
|
|
```
|
|
| 상태 | 접근 가능 범위 |
|
|
|---|---|
|
|
| NO_COMPANY | 로그인 가능, B01만 (B02~B11 차단) |
|
|
| PENDING | 로그인 가능, B01만 (승인 대기) |
|
|
| ACTIVE | 전체 (B01 + B02~B11) |
|
|
|
|
## 역할 (users.role)
|
|
| 역할 | 전체회사조회 | 역할변경 | 팀원관리 | 가입승인 | 프로젝트조회 범위 |
|
|
|---|---|---|---|---|---|
|
|
| SYSTEM_ADMIN | ✅ | ✅ | ✅ | ✅ | 전체 |
|
|
| ADMIN | ✗ | ✗ | ✅(자기회사) | ✅(자기회사) | 회사별 |
|
|
| USER | ✗ | ✗ | ✗ | ✗ | 회사별 |
|
|
|
|
`is_master` 플래그: TRUE=회사 생성자/ADMIN(팀원 승인권), FALSE=일반 팀원
|
|
|
|
## 권한 검증 헬퍼 (B01_Dashboard)
|
|
| 항목 | 위치 | 역할 |
|
|
|---|---|---|
|
|
| `_can_edit_project()` | `B01_Dashboard_Router.py:79` | 역할·회사 기준 프로젝트 수정 권한 |
|
|
| `_can_manage_automation()` | `B01_Dashboard_Router.py:87` | USER 차단과 프로젝트 범위 검사 |
|
|
| `_can_edit_user()` | `B01_Dashboard_Router.py:93` | 사용자 수정 범위 검사 |
|
|
| `count_company_admins()` | `B01_Dashboard_Repository.py:584` | 마지막 ADMIN 삭제·강등 방지 |
|
|
| `canEditProject()` 외 5개 | `B01_Dashboard_UI_Helper.ts:3` | 프론트 표시 제어; 백엔드 권한을 대체하지 않음 |
|
|
|
|
**원칙:** 백엔드가 모든 수정/삭제/역할변경 API에서 반드시 재검증 (프론트 UI는 표시 제어만, 신뢰 금지). 위반 시 403 `{"status":"error","message":"Access denied"}`.
|
|
|
|
## 인증 갱신
|
|
로그인 시 `users.auth_expires_at = NOW() + 3개월` 자동 연장. 만료 시 재인증 모달.
|
|
|
|
## 라우팅 가드 (frontend.md 5.2)
|
|
B02~B11 진입 시 `fetchDashboardMe()` → `company_id`+`status` 확인 → NO_COMPANY/PENDING이면 B01로 강제 리다이렉트.
|
|
|
|
## 사용처 (역참조)
|
|
- [[B01_Dashboard/B01_backend|B01_Dashboard]] — 권한 헬퍼 5종, RBAC 접근제어
|
|
- [[A06_Login/A06_backend]] — 세션 발급/OTP 재인증, 상태 확인
|
|
- [[A07_Register/A07_backend]] — 사용자 상태 생명주기(PENDING_EMAIL→NO_COMPANY)
|
|
- [[A09_Security/A09_backend]] — require_master/require_system_admin 권한 데코레이터
|
|
|
|
## ⚠️ 계획서-실코드 불일치 (A그룹 인제스트 발견)
|
|
이 페이지의 세션/OTP 정책은 **계획서 기준**(세션 12h/4h 만료, OTP 5분·재시도3회·5회실패 15분잠금)이나,
|
|
실 코드([[A06_Login/A06_backend]])는 `auth_expires_at = NOW()+3개월` 갱신·신규브라우저/주기 재인증 OTP·5회실패시 관리자 알림 메일 방식.
|
|
[[A09_Security/A09_frontend]] 약관 텍스트도 계획서 기준(12h/4h)으로 표기됨.
|
|
→ 규칙6(실 코드 우선)에 따라 실 정책 검증 후 이 페이지 갱신 필요. 계획 당시 의도로 위 내용은 보존.
|