7. 보안 설계
7.1 보안 개요
섹션 제목: “7.1 보안 개요”dcamp 웹사이트는 스타트업 정보, 회원 개인정보, 심사 데이터 등 민감한 정보를 다루기 때문에 다중 보안 레이어를 적용했습니다. 핵심 원칙은 “일반 사용자와 관리자의 완전한 분리”입니다.
┌─────────────────────────────────────────────────────────────────┐│ 보안 레이어 구조 │├─────────────────────────────────────────────────────────────────┤│ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ Layer 1: Cloudflare Access (네트워크 보안) │ ││ │ - 등록된 이메일만 접근 허용 │ ││ │ - 이메일 인증(MFA) 필수 │ ││ └─────────────────────────────────────────────────────────┘ ││ ▼ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ Layer 2: Drupal Login (인증) │ ││ │ - 이메일/비밀번호 인증 │ ││ │ - 5회 실패 시 계정 잠금 │ ││ └─────────────────────────────────────────────────────────┘ ││ ▼ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ Layer 3: Session Control (세션 관리) │ ││ │ - 30분 타임아웃 │ ││ │ - 동시 접속 차단 │ ││ └─────────────────────────────────────────────────────────┘ ││ │└─────────────────────────────────────────────────────────────────┘7.2 계정 완전 분리
섹션 제목: “7.2 계정 완전 분리”가장 중요한 보안 설계 원칙입니다. 일반 회원과 관리자 계정을 완전히 분리하여 상호 접근이 불가능합니다.
왜 분리했나?
섹션 제목: “왜 분리했나?”| 문제 상황 | 분리 전 | 분리 후 |
|---|---|---|
| 일반 회원 계정 해킹 | 관리 시스템까지 위험 | 관리 시스템은 안전 |
| 권한 설정 실수 | 일반 회원에게 관리 권한 부여 가능 | 원천적으로 불가능 |
| 퇴사자 계정 관리 | 복잡한 권한 회수 필요 | 관리자 계정만 삭제하면 됨 |
분리 구조
섹션 제목: “분리 구조”┌──────────────────────────┐ ┌──────────────────────────┐│ dcamp.kr │ │ admin.dcamp.kr ││ (일반 사용자) │ │ (관리자) │├──────────────────────────┤ ├──────────────────────────┤│ │ │ ││ 계정: user.user │ ✗ │ 계정: user.manager ││ │ ───► │ ││ - 소셜 로그인 가능 │ │ - 이메일/비밀번호만 ││ - 자가 회원가입 │ ◄─── │ - 관리자가 계정 생성 ││ - 프로그램 신청 │ ✗ │ - 시스템 관리 ││ │ │ │└──────────────────────────┘ └──────────────────────────┘ ▲ ▲ │ │ └────────── 교차 접근 불가 ─────────────┘7.3 3단계 로그인 보안
섹션 제목: “7.3 3단계 로그인 보안”관리자 페이지(admin.dcamp.kr)는 3단계 보안을 통과해야 접근할 수 있습니다.
Step 1: Cloudflare Access (네트워크 보안)
섹션 제목: “Step 1: Cloudflare Access (네트워크 보안)”목적: 등록되지 않은 사용자는 로그인 페이지조차 볼 수 없도록 차단
[사용자] [Cloudflare] [admin.dcamp.kr] │ │ │ │ 접속 시도 │ │ │ ───────────────────► │ │ │ │ │ │ 이메일 인증 요청 │ │ │ ◄─────────────────── │ │ │ │ │ │ 인증 코드 입력 │ │ │ ───────────────────► │ │ │ │ │ │ │ 인증 통과 시에만 │ │ │ 접근 허용 ───────────► │- 사전 등록된 이메일만 접근 가능
- 이메일로 인증 코드 발송
- URL을 알아도 미등록자는 접근 불가
Step 2: Drupal Login (인증)
섹션 제목: “Step 2: Drupal Login (인증)”목적: 시스템 계정 확인
- 이메일 + 비밀번호 인증
- 소셜 로그인 불가 (보안 강화)
- 5회 실패 시 계정 잠금
Step 3: Session Control (세션 관리)
섹션 제목: “Step 3: Session Control (세션 관리)”목적: 로그인 후에도 지속적인 보안 유지
| 정책 | 내용 |
|---|---|
| 자동 로그아웃 | 30분간 활동 없으면 자동 로그아웃 |
| 동시 접속 차단 | 다른 기기에서 로그인 시 기존 세션 종료 |
| 세션 암호화 | 세션 정보 암호화 저장 |
7.4 역할 기반 권한 관리
섹션 제목: “7.4 역할 기반 권한 관리”관리자라고 해서 모든 기능에 접근할 수 있는 것이 아닙니다. 담당 업무에 따라 접근 가능한 기능을 제한합니다.
주요 역할
섹션 제목: “주요 역할”| 역할 | 대상 | 주요 권한 |
|---|---|---|
| administrator | 시스템 관리자 | 모든 기능 |
| planning | 기획실 | 회원 관리, 전체 프로그램, 콘텐츠 |
| investment | 투자실 | 배치 프로그램, 포트폴리오 |
| business | 사업실 | 배치, 오피스아워, 스타트업 관리 |
| growth | Growth팀 | 오피스아워, 그로스코칭 |
| judge | 심사위원 | 심사 기능만 |
권한 분리 예시
섹션 제목: “권한 분리 예시”┌───────────────────────────────────────────────────────────────┐│ 회원 관리 ││ 접근 가능: administrator, planning ││ 접근 불가: 기타 모든 역할 │└───────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────┐│ 배치 프로그램 ││ 접근 가능: administrator, planning, investment, business ││ 접근 불가: growth, judge, space │└───────────────────────────────────────────────────────────────┘
┌───────────────────────────────────────────────────────────────┐│ 심사 기능 ││ 접근 가능: administrator, planning, judge ││ 접근 불가: 기타 역할 (조회만 가능) │└───────────────────────────────────────────────────────────────┘7.5 API 보안
섹션 제목: “7.5 API 보안”공개 API vs 인증 필요 API
섹션 제목: “공개 API vs 인증 필요 API”| 구분 | 접근 방식 | 예시 |
|---|---|---|
| 공개 API | 누구나 접근 | 공지사항 목록, 스타트업 공개 정보 |
| 인증 필요 | 토큰 필수 | 마이페이지, 신청서 제출 |
| 관리자 전용 | 관리자 토큰 + 권한 | 회원 목록, 심사 데이터 |
토큰 기반 인증
섹션 제목: “토큰 기반 인증”[프론트엔드] [관리 시스템] │ │ │ 1. 로그인 요청 │ │ (이메일/비밀번호) │ │ ──────────────────────────► │ │ │ │ 2. Access Token 발급 │ │ (유효기간: 1시간) │ │ ◄────────────────────────── │ │ │ │ 3. API 요청 │ │ Authorization: Bearer xxx │ │ ──────────────────────────► │ │ │ │ 4. 토큰 검증 후 응답 │ │ ◄────────────────────────── │7.6 데이터 보안
섹션 제목: “7.6 데이터 보안”민감 정보 처리
섹션 제목: “민감 정보 처리”| 데이터 유형 | 보호 방식 |
|---|---|
| 비밀번호 | 단방향 해시 암호화 (복호화 불가) |
| 개인정보 | DB 암호화, 접근 로그 기록 |
| 파일 저장 | S3 비공개 버킷, 서명된 URL로 접근 |
| 세션 정보 | 암호화 저장, HTTPS 전송 |
외부 공격 방어
섹션 제목: “외부 공격 방어”| 공격 유형 | 방어 방식 |
|---|---|
| DDoS | Cloudflare 방어 |
| SQL Injection | ORM 사용, 파라미터 바인딩 |
| XSS | 입력값 이스케이프, CSP 헤더 |
| CSRF | 토큰 기반 검증 |
7.7 보안 정책 요약
섹션 제목: “7.7 보안 정책 요약”| 영역 | 정책 |
|---|---|
| 계정 분리 | 일반 회원 / 관리자 완전 분리 |
| 인증 | 3단계 보안 (Cloudflare → 로그인 → 세션) |
| 권한 | 역할 기반 최소 권한 원칙 |
| 세션 | 30분 타임아웃, 동시 접속 차단 |
| API | 토큰 기반 인증, HTTPS 필수 |
| 데이터 | 암호화 저장, 접근 로그 기록 |