보안과 권한 관리
보안과 권한 관리
데이터베이스 보안의 유형과 SQL을 이용한 권한 관리, 역할(Role) 기반 접근 제어를 다룬다.
1. 데이터베이스 보안
1.1 보안의 목표
조직에서 허가한 사용자만 데이터베이스에 접근할 수 있도록 통제하여 데이터를 보호하는 것이다.
1.2 보안의 유형
┌─────────────────────────────────────────────────────────────────────────┐
│ 데이터베이스 보안 유형 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 물리적 환경 │ │ 권한 관리 │ │ 운영 관리 │ │
│ │ 보안 │ │ 보안 │ │ 보안 │ │
│ └────────┬────────┘ └────────┬────────┘ └────────┬────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ • 자연재해 │ │ • 접근 제어 │ │ • 무결성 제약 │ │
│ │ • 화재/침수 │ │ • 계정 관리 │ │ • 데이터 검증 │ │
│ │ • 물리적 침입 │ │ • 권한 부여/취소│ │ • 감사 로그 │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ 외부 위협으로부터 권한 없는 사용자로부터 권한 있는 사용자의 │
│ DB 보호 DB 보호 실수로부터 DB 보호 │
│ │
└─────────────────────────────────────────────────────────────────────────┘| 보안 유형 | 보호 대상 | 주요 방법 |
|---|---|---|
| 물리적 환경 보안 | 자연재해, 물리적 손상 | 백업, 이중화, 재해 복구 센터 |
| 권한 관리 보안 | 권한 없는 사용자 | 접근 제어, 계정 관리, GRANT/REVOKE |
| 운영 관리 보안 | 권한 있는 사용자의 실수 | 무결성 제약조건, 감사 로그 |
2. 권한 관리
2.1 권한 관리의 개념
┌─────────────────────────────────────────────────────────────────────────┐
│ 접근 제어 흐름 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 사용자 │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 로그인 시도 │ │
│ │ (계정 + 암호) │ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ 실패 ┌─────────────────┐ │
│ │ 접근 제어 │ ─────────► │ 접근 거부 │ │
│ │ (Access Control)│ └─────────────────┘ │
│ └────────┬────────┘ │
│ │ 성공 │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 권한 확인 │ │
│ │ (Authorization)│ │
│ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ 허용된 작업만 │ │
│ │ 수행 가능 │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘2.2 객체 권한의 종류
| 권한 | 설명 | 적용 대상 |
|---|---|---|
| SELECT | 데이터 조회 | 테이블, 뷰 |
| INSERT | 데이터 삽입 | 테이블, 뷰 |
| UPDATE | 데이터 수정 | 테이블, 뷰 (속성 지정 가능) |
| DELETE | 데이터 삭제 | 테이블, 뷰 |
| REFERENCES | 외래키로 참조 | 테이블 |
| ALL | 모든 권한 | 테이블, 뷰 |
2.3 권한 부여 (GRANT)
GRANT 권한 ON 객체 TO 사용자 [WITH GRANT OPTION];기본 예제
-- 특정 사용자에게 SELECT 권한 부여
GRANT SELECT ON 고객 TO user1;
-- 여러 권한 동시 부여
GRANT SELECT, INSERT, UPDATE ON 주문 TO user2;
-- 모든 권한 부여
GRANT ALL ON 제품 TO user3;
-- 모든 사용자에게 권한 부여
GRANT SELECT ON 공지사항 TO PUBLIC;속성별 권한 부여
-- 특정 속성에만 UPDATE 권한 부여
GRANT UPDATE(전화번호, 주소) ON 고객 TO user1;
-- 특정 속성에만 SELECT 권한 부여
GRANT SELECT(고객명, 이메일) ON 고객 TO user2;WITH GRANT OPTION
-- 권한을 다른 사용자에게 전파할 수 있는 권한 부여
GRANT SELECT ON 고객 TO user1 WITH GRANT OPTION;┌─────────────────────────────────────────────────────────────────────────┐
│ WITH GRANT OPTION 권한 전파 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ │
│ │ DBA │ (객체 소유자) │
│ └────┬────┘ │
│ │ │
│ GRANT ... WITH GRANT OPTION │
│ │ │
│ ▼ │
│ ┌─────────┐ │
│ │ user1 │ ← 권한 전파 가능 │
│ └────┬────┘ │
│ │ │
│ GRANT ... │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ user2 │ │ user3 │ │ user4 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ user1이 권한을 다른 사용자에게 부여할 수 있음 │
│ │
└─────────────────────────────────────────────────────────────────────────┘2.4 권한 취소 (REVOKE)
REVOKE 권한 ON 객체 FROM 사용자 CASCADE | RESTRICT;| 옵션 | 설명 |
|---|---|
| CASCADE | 연쇄적으로 권한 취소 (전파된 권한도 함께 취소) |
| RESTRICT | 전파된 권한이 있으면 취소 거부 |
기본 예제
-- 특정 사용자의 SELECT 권한 취소
REVOKE SELECT ON 고객 FROM user1;
-- 여러 권한 동시 취소
REVOKE INSERT, UPDATE ON 주문 FROM user2;
-- 연쇄적 권한 취소 (user1이 부여한 권한도 함께 취소)
REVOKE SELECT ON 고객 FROM user1 CASCADE;
-- 전파된 권한이 있으면 취소 거부
REVOKE SELECT ON 고객 FROM user1 RESTRICT;CASCADE vs RESTRICT
┌─────────────────────────────────────────────────────────────────────────┐
│ CASCADE vs RESTRICT 비교 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ [초기 상태] │
│ DBA ──GRANT──► user1 ──GRANT──► user2 ──GRANT──► user3 │
│ │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ [CASCADE: REVOKE ... FROM user1 CASCADE] │
│ DBA user1 user2 user3 │
│ │ ✗ ✗ ✗ │
│ │ 권한 취소 연쇄 취소 연쇄 취소 │
│ │
│ ───────────────────────────────────────────────────────────────── │
│ │
│ [RESTRICT: REVOKE ... FROM user1 RESTRICT] │
│ → user1이 다른 사용자에게 권한을 부여했으므로 취소 거부 (에러) │
│ → 먼저 user2, user3의 권한을 취소해야 함 │
│ │
└─────────────────────────────────────────────────────────────────────────┘2.5 시스템 권한
시스템 권한은 DDL 관련 작업에 대한 권한으로, DBA가 부여한다.
| 시스템 권한 | 설명 |
|---|---|
| CREATE TABLE | 테이블 생성 권한 |
| CREATE VIEW | 뷰 생성 권한 |
| CREATE INDEX | 인덱스 생성 권한 |
| CREATE USER | 사용자 생성 권한 |
| DROP ANY TABLE | 모든 테이블 삭제 권한 |
-- 시스템 권한 부여 (DBA가 수행)
GRANT CREATE TABLE TO user1;
GRANT CREATE VIEW, CREATE INDEX TO user2;
-- 시스템 권한 취소
REVOKE CREATE TABLE FROM user1;3. 역할 (Role)
3.1 역할의 개념
역할(Role) 은 여러 권한을 그룹으로 묶어놓은 것으로, 권한 관리를 효율적으로 수행할 수 있다.
┌─────────────────────────────────────────────────────────────────────────┐
│ 역할 기반 권한 관리 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ [개별 권한 부여 방식] [역할 사용 방식] │
│ │
│ 권한1 ────► user1 권한1 ─┐ │
│ 권한2 ────► user1 권한2 ─┼──► ROLE ──┬──► user1 │
│ 권한3 ────► user1 권한3 ─┘ ├──► user2 │
│ 권한1 ────► user2 └──► user3 │
│ 권한2 ────► user2 │
│ 권한3 ────► user2 │
│ 권한1 ────► user3 │
│ 권한2 ────► user3 ✓ 한 번에 여러 권한 부여 │
│ 권한3 ────► user3 ✓ 권한 변경 시 자동 반영 │
│ ✓ 관리 용이 │
│ ✗ 반복 작업 필요 │
│ ✗ 변경 시 모두 수정 │
│ │
└─────────────────────────────────────────────────────────────────────────┘3.2 역할 관리 명령어
역할 생성 (DBA)
CREATE ROLE 역할이름;역할에 권한 추가 (객체 소유자)
GRANT 권한 ON 객체 TO 역할이름;역할을 사용자에게 부여 (DBA)
GRANT 역할이름 TO 사용자;역할 취소 (DBA)
REVOKE 역할이름 FROM 사용자;역할 삭제 (DBA)
DROP ROLE 역할이름;3.3 역할 활용 예제
-- 1. 역할 생성 (DBA)
CREATE ROLE sales_role;
CREATE ROLE manager_role;
-- 2. 역할에 권한 추가 (객체 소유자)
GRANT SELECT ON 고객 TO sales_role;
GRANT SELECT ON 주문 TO sales_role;
GRANT INSERT ON 주문 TO sales_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON 고객 TO manager_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON 주문 TO manager_role;
GRANT SELECT, INSERT, UPDATE ON 제품 TO manager_role;
-- 3. 역할을 사용자에게 부여 (DBA)
GRANT sales_role TO kim, lee, park;
GRANT manager_role TO choi;
-- 4. 역할에 권한 추가 (자동으로 모든 사용자에게 반영)
GRANT SELECT ON 제품 TO sales_role;
-- → kim, lee, park 모두 제품 테이블 조회 가능
-- 5. 역할 취소
REVOKE sales_role FROM park;
-- 6. 역할 삭제
DROP ROLE sales_role;
-- → sales_role을 가진 모든 사용자의 권한도 취소됨3.4 역할 계층 구조
┌─────────────────────────────────────────────────────────────────────────┐
│ 역할 계층 구조 예시 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ │
│ │ DBA_ROLE │ ← 모든 권한 │
│ └──────┬───────┘ │
│ │ │
│ ┌────────────────┼────────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ MANAGER_ROLE │ │ ANALYST_ROLE │ │ DEV_ROLE │ │
│ │ │ │ │ │ │ │
│ │ • 전체 CRUD │ │ • SELECT ALL │ │ • 개발 DB │ │
│ │ • 사용자관리 │ │ • 리포트생성 │ │ 접근권한 │ │
│ └──────┬───────┘ └──────────────┘ └──────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ STAFF_ROLE │ ← 기본 조회/입력 권한 │
│ └──────────────┘ │
│ │
│ 역할에 다른 역할을 부여하여 계층 구조 생성 가능 │
│ GRANT STAFF_ROLE TO MANAGER_ROLE; │
│ │
└─────────────────────────────────────────────────────────────────────────┘4. 데이터 암호화
4.1 암호화 개념
| 용어 | 설명 |
|---|---|
| 평문(Plaintext) | 암호화되지 않은 원본 데이터 |
| 암호문(Ciphertext) | 암호화된 데이터 |
| 암호화(Encryption) | 평문 → 암호문 변환 |
| 복호화(Decryption) | 암호문 → 평문 변환 |
| 키(Key) | 암호화/복호화에 사용되는 비밀 값 |
┌─────────────────────────────────────────────────────────────────────────┐
│ 암호화/복호화 과정 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 암호화 ┌─────────┐ 복호화 ┌─────────┐
│ │ 평문 │ ─────────────────► │ 암호문 │ ─────────────────► │ 평문 │
│ │ "Hello" │ + 키 │ "Xk2#p" │ + 키 │ "Hello" │
│ └─────────┘ └─────────┘ └─────────┘
│ │
└─────────────────────────────────────────────────────────────────────────┘4.2 암호화 방식 비교
┌─────────────────────────────────────────────────────────────────────────┐
│ 대칭 암호화 vs 비대칭 암호화 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ [대칭 암호화] [비대칭 암호화 (공개키)] │
│ │
│ 암호화 키 = 복호화 키 공개키 ≠ 개인키 │
│ │
│ ┌──────┐ 동일 키 ┌──────┐ ┌──────┐ 공개키 ┌──────┐ │
│ │ 송신 │ ◄───────► │ 수신 │ │ 송신 │ ────────► │ 수신 │ │
│ └──────┘ └──────┘ └──────┘ 암호화 └──────┘ │
│ │ │
│ 예: DES, AES ▼ │
│ 개인키로 복호화 │
│ 장점: 빠른 속도 │
│ 단점: 키 공유 문제 예: RSA │
│ │
│ 장점: 키 공유 불필요 │
│ 단점: 느린 속도 │
│ │
└─────────────────────────────────────────────────────────────────────────┘| 구분 | 대칭 암호화 | 비대칭 암호화 |
|---|---|---|
| 키 구성 | 동일한 키 사용 | 공개키 + 개인키 |
| 속도 | 빠름 | 느림 |
| 키 관리 | 키 공유 필요 (보안 문제) | 공개키 배포 가능 |
| 대표 알고리즘 | DES, AES | RSA |
| 용도 | 대용량 데이터 암호화 | 키 교환, 전자서명 |
4.3 주요 암호화 알고리즘
| 알고리즘 | 유형 | 키 크기 | 특징 |
|---|---|---|---|
| DES | 대칭 | 56비트 | 구식, 보안 취약 |
| AES | 대칭 | 128/192/256비트 | 현재 표준, 빠름 |
| RSA | 비대칭 | 1024~4096비트 | 산업 표준, 전자서명 |
4.4 MySQL 암호화 함수
-- AES 암호화/복호화
SET @key = 'my_secret_key_123';
-- 암호화
INSERT INTO 사용자 (아이디, 비밀번호)
VALUES ('user1', AES_ENCRYPT('password123', @key));
-- 복호화
SELECT 아이디, AES_DECRYPT(비밀번호, @key) AS 비밀번호
FROM 사용자
WHERE 아이디 = 'user1';
-- SHA2 해시 (단방향 - 복호화 불가)
INSERT INTO 사용자 (아이디, 비밀번호)
VALUES ('user2', SHA2('password123', 256));
-- 비밀번호 검증
SELECT * FROM 사용자
WHERE 아이디 = 'user2'
AND 비밀번호 = SHA2('password123', 256);5. 실무 예제
5.1 사용자 및 권한 관리 (MySQL)
-- 1. 사용자 생성
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'secure_password';
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'readonly_pass';
-- 2. 데이터베이스 레벨 권한 부여
GRANT ALL PRIVILEGES ON shop_db.* TO 'app_user'@'localhost';
GRANT SELECT ON shop_db.* TO 'readonly_user'@'%';
-- 3. 테이블 레벨 권한 부여
GRANT SELECT, INSERT ON shop_db.orders TO 'sales_user'@'localhost';
GRANT UPDATE(status) ON shop_db.orders TO 'sales_user'@'localhost';
-- 4. 권한 적용
FLUSH PRIVILEGES;
-- 5. 권한 확인
SHOW GRANTS FOR 'app_user'@'localhost';
-- 6. 권한 취소
REVOKE INSERT ON shop_db.orders FROM 'sales_user'@'localhost';
-- 7. 사용자 삭제
DROP USER 'readonly_user'@'%';5.2 역할 관리 (MySQL 8.0+)
-- 1. 역할 생성
CREATE ROLE 'app_read', 'app_write', 'app_admin';
-- 2. 역할에 권한 부여
GRANT SELECT ON shop_db.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON shop_db.* TO 'app_write';
GRANT ALL PRIVILEGES ON shop_db.* TO 'app_admin';
-- 3. 사용자에게 역할 부여
GRANT 'app_read' TO 'user1'@'localhost';
GRANT 'app_read', 'app_write' TO 'user2'@'localhost';
GRANT 'app_admin' TO 'admin'@'localhost';
-- 4. 기본 역할 설정
SET DEFAULT ROLE 'app_read' TO 'user1'@'localhost';
SET DEFAULT ROLE ALL TO 'user2'@'localhost';
-- 5. 현재 세션에서 역할 활성화
SET ROLE 'app_read';
SET ROLE ALL;
-- 6. 역할 삭제
DROP ROLE 'app_read';5.3 뷰를 통한 접근 제어
-- 민감한 정보를 제외한 뷰 생성
CREATE VIEW 고객_공개정보 AS
SELECT 고객ID, 고객명, 가입일
FROM 고객;
-- 주민번호, 연락처 등 민감 정보 제외
-- 특정 조건의 데이터만 노출하는 뷰
CREATE VIEW 내_주문 AS
SELECT * FROM 주문
WHERE 고객ID = CURRENT_USER();
-- 뷰에 대한 권한 부여
GRANT SELECT ON 고객_공개정보 TO 'public_user'@'localhost';6. 핵심 요약
┌─────────────────────────────────────────────────────────────────────────┐
│ 보안과 권한 관리 요약 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 보안 유형 │
│ ├── 물리적 환경 보안: 자연재해, 물리적 손상으로부터 보호 │
│ ├── 권한 관리 보안: 권한 없는 사용자로부터 보호 (GRANT/REVOKE) │
│ └── 운영 관리 보안: 권한 있는 사용자의 실수로부터 보호 (무결성) │
│ │
│ 권한 관리 │
│ ├── GRANT: 권한 부여 │
│ │ └── WITH GRANT OPTION: 권한 전파 허용 │
│ ├── REVOKE: 권한 취소 │
│ │ ├── CASCADE: 연쇄 취소 │
│ │ └── RESTRICT: 전파된 권한 있으면 거부 │
│ └── 권한 종류: SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALL │
│ │
│ 역할 (Role) │
│ ├── CREATE ROLE: 역할 생성 │
│ ├── GRANT 권한 TO 역할: 역할에 권한 추가 │
│ ├── GRANT 역할 TO 사용자: 사용자에게 역할 부여 │
│ ├── REVOKE 역할 FROM 사용자: 역할 취소 │
│ └── DROP ROLE: 역할 삭제 │
│ │
│ 암호화 │
│ ├── 대칭 암호화: 동일 키 (DES, AES) - 빠름 │
│ └── 비대칭 암호화: 공개키/개인키 (RSA) - 안전 │
│ │
└─────────────────────────────────────────────────────────────────────────┘| 작업 | 명령어 | 수행자 |
|---|---|---|
| 권한 부여 | GRANT 권한 ON 객체 TO 사용자 | 객체 소유자 |
| 권한 취소 | REVOKE 권한 ON 객체 FROM 사용자 | 객체 소유자 |
| 역할 생성 | CREATE ROLE 역할명 | DBA |
| 역할 부여 | GRANT 역할 TO 사용자 | DBA |
| 역할 삭제 | DROP ROLE 역할명 | DBA |