πŸ“Œ DCL (Data Control Language, 데이터 μ œμ–΄μ–΄)

λ°μ΄ν„°μ˜ 무결성을 μœ μ§€ν•˜κ³ , λΆˆλ²•μ μΈ 접근을 λ°©μ§€ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

βœ… DCL의 μ£Όμš” λͺ…λ Ήμ–΄

λͺ…λ Ήμ–΄ μ„€λͺ…
GRANT νŠΉμ • μ‚¬μš©μžμ—κ²Œ κΆŒν•œ λΆ€μ—¬
REVOKE νŠΉμ • μ‚¬μš©μžμ˜ κΆŒν•œ 회수
CREATE USER μƒˆλ‘œμš΄ μ‚¬μš©μž 생성
DROP USER κΈ°μ‘΄ μ‚¬μš©μž μ‚­μ œ
SHOW GRANTS μ‚¬μš©μžμ˜ ν˜„μž¬ κΆŒν•œ 확인

πŸ”· 5-1. μ‚¬μš©μž 생성 (CREATE USER)

βœ… MariaDBμ—μ„œ μƒˆλ‘œμš΄ λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μžλ₯Ό μƒμ„±ν•˜λŠ” 방법

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password123';

πŸ“Œ new_user μ‚¬μš©μžλ₯Ό 둜컬(localhost)μ—μ„œ 접속 κ°€λŠ₯ν•˜λ„λ‘ μƒμ„±ν•˜κ³ , λΉ„λ°€λ²ˆν˜Έλ₯Ό password123으둜 μ„€μ •.

βœ… λͺ¨λ“  IPμ—μ„œ 접속 κ°€λŠ₯ν•˜λ„λ‘ μ‚¬μš©μž 생성

βœ… λΉ„λ°€λ²ˆν˜Έ μ •μ±… κ°•ν™”

CREATE USER 'secure_user'@'localhost'
IDENTIFIED BY 'StrongP@ssw0rd!'
PASSWORD EXPIRE INTERVAL 90 DAY;

πŸ“Œ λΉ„λ°€λ²ˆν˜Έ 만료 기간을 μ„€μ •ν•˜μ—¬ λ³΄μ•ˆ κ°•ν™”λ₯Ό μΆ”μ²œν•¨.

CREATE USER 'remote_user'@'%' IDENTIFIED BY 'securePass!';

πŸ“Œ %λŠ” λͺ¨λ“  IPμ—μ„œ 접속 κ°€λŠ₯ν•˜λ„λ‘ ν—ˆμš©ν•˜λŠ” μ™€μΌλ“œμΉ΄λ“œ.

πŸ“Œ λ³΄μ•ˆμƒ μœ„ν—˜ν•  수 μžˆμœΌλ―€λ‘œ μ‹ μ€‘ν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό 함.


πŸ”· 5-2. μ‚¬μš©μž κΆŒν•œ λΆ€μ—¬ (GRANT)

βœ… μ‚¬μš©μžμ—κ²Œ νŠΉμ • κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ” GRANT λ¬Έ

GRANT SELECT, INSERT, UPDATE ON company_db.* TO 'new_user'@'localhost';

πŸ“Œ μ‚¬μš©μž new_userμ—κ²Œ company_db λ°μ΄ν„°λ² μ΄μŠ€μ˜ λͺ¨λ“  ν…Œμ΄λΈ”μ—μ„œ SELECT, INSERT, UPDATE κΆŒν•œμ„ λΆ€μ—¬.

βœ… λͺ¨λ“  κΆŒν•œμ„ λΆ€μ—¬ (κ΄€λ¦¬μž 계정)

GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;

πŸ“Œ admin_userκ°€ λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€μ™€ ν…Œμ΄λΈ”μ—μ„œ λͺ¨λ“  κΆŒν•œμ„ 가짐 (ALL PRIVILEGES).

πŸ“Œ WITH GRANT OPTION을 μ‚¬μš©ν•˜λ©΄ 이 μ‚¬μš©μžκ°€ λ‹€λ₯Έ μ‚¬μš©μžμ—κ²Œλ„ κΆŒν•œμ„ λΆ€μ—¬ν•  수 있음.

βœ… κΆŒν•œμ„ μ¦‰μ‹œ μ μš©ν•˜κΈ° μœ„ν•΄ FLUSH PRIVILEGES μ‹€ν–‰

FLUSH PRIVILEGES;

πŸ“Œ MariaDBμ—μ„œ κΆŒν•œ λ³€κ²½ 사항을 μ¦‰μ‹œ λ°˜μ˜ν•˜λŠ” λͺ…λ Ήμ–΄.


πŸ”· 5-3. μ‚¬μš©μž κΆŒν•œ 회수 (REVOKE)

βœ… νŠΉμ • κΆŒν•œλ§Œ νšŒμˆ˜ν•˜λŠ” REVOKE λ¬Έ

REVOKE INSERT, UPDATE ON company_db.* FROM 'new_user'@'localhost';

πŸ“Œ μ‚¬μš©μž new_userκ°€ company_db λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ INSERT, UPDATE κΆŒν•œμ„ μžƒμŒ.

πŸ“Œ SELECT κΆŒν•œμ€ μœ μ§€λ¨.

βœ… λͺ¨λ“  κΆŒν•œ 제거

REVOKE ALL PRIVILEGES ON *.* FROM 'admin_user'@'localhost';

πŸ“Œ μ‚¬μš©μž admin_user의 λͺ¨λ“  κΆŒν•œμ„ μ œκ±°ν•˜μ§€λ§Œ, 계정은 μ‚­μ œλ˜μ§€ μ•ŠμŒ.

βœ… λ³€κ²½ 사항 μ¦‰μ‹œ 적용

FLUSH PRIVILEGES;

πŸ“Œ κΆŒν•œ λ³€κ²½ ν›„ λ°˜λ“œμ‹œ μ‹€ν–‰ν•΄μ•Ό 적용됨.

🚨 3. REVOKE κΆŒν•œ 회수 주의점

βœ… 문제점

βœ… λ³΄κ°•λœ μ½”λ“œ

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'admin_user'@'localhost';
DROP USER 'admin_user'@'localhost'; -- 계정 μ™„μ „ μ‚­μ œ

πŸ“Œ κΆŒν•œλ§Œ μ œκ±°ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, κ³„μ •κΉŒμ§€ μ‚­μ œν•˜λ €λ©΄ DROP USER도 ν•¨κ»˜ μ‹€ν–‰ν•΄μ•Ό 함.

βœ… νŠΉμ • κΆŒν•œλ§Œ 회수

REVOKE INSERT, UPDATE ON company_db.* FROM 'developer'@'localhost';

πŸ“Œ 개발자 κ³„μ •μ˜ INSERT, UPDATE κΆŒν•œλ§Œ μ œκ±°ν•˜κ³  SELECT κΆŒν•œμ€ μœ μ§€.


πŸ”· 5-4. μ‚¬μš©μž μ‚­μ œ (DROP USER)

βœ… μ‚¬μš©μžλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ‚­μ œ

DROP USER 'new_user'@'localhost';

πŸ“Œ ν•΄λ‹Ή μ‚¬μš©μžμ˜ λͺ¨λ“  κΆŒν•œκ³Ό 계정이 μ™„μ „νžˆ μ‚­μ œλ¨.

πŸ“Œ μ‚¬μš©μžλ₯Ό μ‚­μ œν•˜κΈ° 전에 κ΄€λ ¨ λ°μ΄ν„°λ² μ΄μŠ€ 연결이 μ—†λŠ”μ§€ ν™•μΈν•˜λŠ” 것이 μ’‹μŒ.

βœ… μ—¬λŸ¬ μ‚¬μš©μž μ‚­μ œ

DROP USER 'user1'@'localhost', 'user2'@'%';

πŸ“Œ μ—¬λŸ¬ μ‚¬μš©μžλ₯Ό λ™μ‹œμ— μ‚­μ œν•  μˆ˜λ„ 있음.

🚨 DROP USER μ‹€ν–‰ μ‹œ 주의점

βœ… 문제점

βœ… λ³΄κ°•λœ μ½”λ“œ

DROP USER IF EXISTS 'old_user'@'localhost';

πŸ“Œ μ‚¬μš©μžκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 였λ₯˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ IF EXISTSλ₯Ό μΆ”κ°€.

βœ… ν˜„μž¬ μ—°κ²°λœ μ‚¬μš©μžλ₯Ό κ°•μ œλ‘œ μ’…λ£Œ ν›„ μ‚­μ œ

SELECT id, user, host FROM information_schema.processlist WHERE user = 'old_user';

KILL 12345;  -- ν•΄λ‹Ή μ‚¬μš©μžμ˜ ν”„λ‘œμ„ΈμŠ€ IDλ₯Ό μ’…λ£Œ (예: ID=12345)

DROP USER 'old_user'@'localhost';

πŸ“Œ μ‚¬μš©μžκ°€ 접속 쀑이면 KILL λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ’…λ£Œν•œ ν›„ DROP USER μ‹€ν–‰.


πŸ”· 5-5. μ‚¬μš©μž κΆŒν•œ 확인 (SHOW GRANTS)

βœ… μ‚¬μš©μžμ˜ ν˜„μž¬ κΆŒν•œμ„ ν™•μΈν•˜λŠ” 방법

SHOW GRANTS FOR 'new_user'@'localhost';

πŸ“Œ ν˜„μž¬ new_userκ°€ κ°€μ§€κ³  μžˆλŠ” κΆŒν•œμ„ 좜λ ₯함.

βœ… ν˜„μž¬ λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ κΆŒν•œ 확인

SHOW GRANTS;

πŸ“Œ ν˜„μž¬ μ ‘μ†ν•œ κ³„μ •μ˜ κΆŒν•œμ„ ν™•μΈν•˜λŠ” κ°€μž₯ λΉ λ₯Έ 방법.

βœ… SHOW GRANTS의 예제 좜λ ₯

GRANT SELECT, INSERT ON `company_db`.* TO 'developer'@'localhost'

πŸ“Œ 이 μ‚¬μš©μžλŠ” company_db λ°μ΄ν„°λ² μ΄μŠ€μ˜ λͺ¨λ“  ν…Œμ΄λΈ”μ—μ„œ SELECT, INSERT κ°€λŠ₯.

βœ… 컬럼 λ‹¨μœ„μ˜ κΆŒν•œ 확인

GRANT SELECT (name, salary) ON company_db.employees TO 'manager'@'localhost';

πŸ“Œ 이 경우 manager 계정은 employees ν…Œμ΄λΈ”μ˜ name, salary 컬럼만 쑰회 κ°€λŠ₯.


πŸ”· 5-6. νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ κΆŒν•œ 관리

βœ… νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ κΆŒν•œλ§Œ λΆ€μ—¬

GRANT SELECT, INSERT ON company_db.* TO 'developer'@'localhost';

πŸ“Œ developerκ°€ company_db λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ SELECT, INSERT만 κ°€λŠ₯ν•˜λ„λ‘ μ œν•œ.

βœ… νŠΉμ • ν…Œμ΄λΈ”μ— λŒ€ν•œ κΆŒν•œλ§Œ λΆ€μ—¬

GRANT SELECT ON company_db.employees TO 'intern'@'localhost';

πŸ“Œ intern 계정은 employees ν…Œμ΄λΈ”μ—μ„œ SELECT만 κ°€λŠ₯.

βœ… νŠΉμ • μ»¬λŸΌμ— λŒ€ν•œ κΆŒν•œ λΆ€μ—¬

GRANT SELECT (name, salary) ON company_db.employees TO 'manager'@'localhost';

πŸ“Œ manager 계정은 employees ν…Œμ΄λΈ”μ—μ„œ name, salary 컬럼만 쑰회 κ°€λŠ₯.


πŸ”· 5-7. λΉ„λ°€λ²ˆν˜Έ λ³€κ²½ 및 λ³΄μ•ˆ μ„€μ •

βœ… μ‚¬μš©μžμ˜ λΉ„λ°€λ²ˆν˜Έ λ³€κ²½

ALTER USER 'new_user'@'localhost' IDENTIFIED BY 'NewSecurePass!';

πŸ“Œ λΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•˜λŠ” κ°€μž₯ μ•ˆμ „ν•œ 방법.

βœ… λΉ„λ°€λ²ˆν˜Έ 만료 μ„€μ •

ALTER USER 'new_user'@'localhost' PASSWORD EXPIRE;

πŸ“Œ μ‚¬μš©μžκ°€ λ‹€μŒ 둜그인 μ‹œ μƒˆλ‘œμš΄ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„€μ •ν•΄μ•Ό 함.

βœ… λΉ„λ°€λ²ˆν˜Έ 만료 κΈ°κ°„ μ„€μ •

ALTER USER 'new_user'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

πŸ“Œ λΉ„λ°€λ²ˆν˜Έκ°€ 90일 ν›„ λ§Œλ£Œλ˜λ„λ‘ μ„€μ •.

βœ… λΉ„λ°€λ²ˆν˜Έ λ³΅μž‘λ„ μ •μ±… μ„€μ •

SET GLOBAL validate_password_length = 10;
SET GLOBAL validate_password_mixed_case_count = 2;
SET GLOBAL validate_password_number_count = 2;
SET GLOBAL validate_password_special_char_count = 2;

πŸ“Œ λΉ„λ°€λ²ˆν˜Έ 정책을 μ„€μ •ν•˜μ—¬ λ³΄μ•ˆ κ°•ν™” (validate_password ν”ŒλŸ¬κ·ΈμΈμ΄ ν™œμ„±ν™”λœ 경우).


πŸ“Œ DCL 핡심 κ°œλ… μš”μ•½

1️⃣ μ‚¬μš©μž 관리 (CREATE USER, DROP USER)

2️⃣ κΆŒν•œ λΆ€μ—¬ (GRANT)

3️⃣ κΆŒν•œ 회수 (REVOKE)

4️⃣ μ‚¬μš©μž κΆŒν•œ 확인 (SHOW GRANTS)

5️⃣ λΉ„λ°€λ²ˆν˜Έ 및 λ³΄μ•ˆ μ„€μ • (ALTER USER)