MySQL 유저 생성 명령어
MySQL에서 애플리케이션 사용자 추가하기
웹 애플리케이션을 운영하다 보면 별도의 데이터베이스 사용자를 생성하여 보안과 접근 권한을 관리해야 할 필요가 있습니다. 특히, 운영 환경에서는 루트(root) 계정을 그대로 사용하는 것은 보안상 바람직하지 않습니다. 따라서, 애플리케이션 전용 계정을 만들고 필요한 권한만 부여하는 것이 일반적인 방법입니다.
이번 글에서는 MySQL에서 특정 애플리케이션 전용 사용자를 추가하고, 해당 사용자에게 권한을 부여하는 방법을 설명하겠습니다.
아래 명령어 구성으로는 프로덕션 환경에 구성하기 힘들긴 하지만, 명령어의 의미와 테스트용으로 정리해보았습니다.
1. MySQL 사용자 생성
MySQL에서는 CREATE USER 명령어를 사용하여 새로운 사용자를 생성할 수 있습니다. 아래의 SQL 문을 실행하면 app이라는 사용자가 생성됩니다.
CREATE USER 'app'@'localhost' IDENTIFIED BY 'qweQWE12!';
CREATE USER 'app'@'127.0.0.1' IDENTIFIED BY 'qweQWE12!';
CREATE USER 'app'@'%' IDENTIFIED BY 'qweQWE12!';
사용자 생성 옵션 설명
'app'@'localhost': 해당 사용자는 서버 내부에서만 접속할 수 있습니다.'app'@'127.0.0.1': 127.0.0.1로 접속하는 경우만 허용됩니다.'app'@'%': 모든 원격 IP에서의 접속을 허용합니다. 다만, 보안상의 이유로 특정 IP로 제한하는 것이 더 안전합니다.
2. 데이터베이스 생성
사용자가 사용할 데이터베이스를 생성합니다. MySQL에서 CREATE DATABASE 명령어를 사용하면 새 데이터베이스를 만들 수 있습니다.
CREATE DATABASE app CHARACTER SET utf8mb4;
app이라는 데이터베이스를 생성합니다.utf8mb4를 설정하여 이모지를 포함한 다양한 문자 지원을 가능하게 합니다.
3. 권한 부여
생성한 사용자에게 해당 데이터베이스에 대한 접근 권한을 부여해야 합니다. 이를 위해 GRANT 명령어를 사용합니다.
GRANT ALL PRIVILEGES ON app.* TO 'app'@'localhost';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'127.0.0.1';
GRANT ALL PRIVILEGES ON app.* TO 'app'@'%';
권한 부여 설명
ALL PRIVILEGES: 해당 사용자에게 모든 권한을 부여합니다.app.*:app데이터베이스의 모든 테이블에 적용됩니다.'app'@'localhost': 로컬 접속 사용자에게 권한을 부여합니다.'app'@'127.0.0.1': 로컬 루프백 사용자에게 권한을 부여합니다.'app'@'%': 원격 접속을 허용합니다.
세부 권한 부여 옵션
GRANT ALL PRIVILEGES 대신, 특정 권한만 부여할 수도 있습니다.
GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'localhost';
이 경우 해당 사용자는 app 데이터베이스에서 조회(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 권한만 가집니다. 이를 통해 필요 이상으로 강한 권한을 부여하지 않도록 조정할 수 있습니다.
다른 중요한 권한으로는 다음과 같은 것들이 있습니다:
CREATE: 테이블, 뷰 등을 생성할 수 있음DROP: 테이블 삭제 가능INDEX: 인덱스 생성 및 수정 가능ALTER: 테이블 구조 변경 가능EXECUTE: 저장 프로시저 실행 가능LOCK TABLES: 테이블 잠금 가능GRANT OPTION: 다른 사용자에게 권한 부여 가능 (주의 필요!)
4. 권한 적용
MySQL에서 사용자 및 권한 변경 사항을 즉시 적용하기 위해 FLUSH PRIVILEGES 명령어를 실행해야 합니다.
FLUSH PRIVILEGES;
5. 보안 고려사항
'app'@'%'사용자는 모든 IP에서 접근 가능하므로, 원격 접속이 필요 없는 경우 삭제하거나 특정 IP로 제한하는 것이 좋습니다.- 비밀번호는 강력하게 설정하고, 정기적으로 변경하는 것이 권장됩니다.
- 방화벽 또는 MySQL 설정(
my.cnf)에서 원격 접속을 제한하는 것도 중요합니다. - MySQL 8.0 이상에서는
caching_sha2_password인증 방식을 사용하므로, 애플리케이션이 지원하는지 확인해야 합니다.
6. 정리 (명령어)
CREATE USER 'app'@'localhost' IDENTIFIED BY 'qweQWE12!';
CREATE USER 'app'@'127.0.0.1' IDENTIFIED BY 'qweQWE12!';
CREATE USER 'app'@'%' IDENTIFIED BY 'qweQWE12!';
CREATE DATABASE app CHARACTER SET utf8mb4;
GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'127.0.0.1';
GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'%';
FLUSH PRIVILEGES;
위 구성으로 MySQL에서 애플리케이션 전용 사용자를 추가하고, 해당 데이터베이스를 관리할 수 있도록 설정하는 방법을 익혔습니다. 필요에 따라 추가적인 권한 설정이나 보안 조치를 적용할 수 있습니다.