MySQL에서 새로 생성한 사용자 계정은 기본적으로 아무런 권한도 갖고 있지 않습니다. 따라서 해당 사용자가 데이터베이스 작업을 수행하려면 반드시 권한을 부여해야 하며, 이때 GRANT 문을 사용합니다.
GRANT 문 기본 구문
GRANT privilege,[privilege],.. ON privilege_level TO user [IDENTIFIED BY password] [REQUIRE tsl_option] [WITH [GRANT_OPTION | resource_option]];
구문 세부 설명
1. 권한(Privilege) 지정 : GRANT 키워드 바로 뒤에 하나 이상의 권한을 지정합니다. 여러 개의 권한을 동시에 부여할 경우 각 권한은 쉼표(,)로 구분합니다.
2. 권한 수준(Privilege Level) 지정 : 권한이 적용될 범위를 결정합니다. MySQL은 전역(*.*), 데이터베이스(database.*), 테이블(database.table), 그리고 컬럼 수준을 지원합니다. 컬럼 수준으로 권한을 부여할 때는 각 권한 뒤에 쉼표로 구분된 하나 이상의 컬럼 목록을 반드시 명시해야 합니다.
3. 대상 사용자 지정 : 권한을 부여할 사용자 계정을 지정합니다. 해당 사용자가 이미 존재하면 GRANT 문은 기존 권한을 수정하고, 존재하지 않으면 새 사용자를 생성합니다. 선택 사항인 IDENTIFIED BY 절을 사용하면 사용자의 새 비밀번호를 설정할 수도 있습니다.
4. 보안 연결 요구 : 사용자가 SSL, X509 등과 같은 보안 연결을 통해 데이터베이스 서버에 접속하도록 요구할지 여부를 지정합니다.
5. WITH 절(선택 사항) : WITH GRANT OPTION을 사용하면 해당 사용자가 자신이 보유한 권한을 다른 사용자에게 부여하거나 회수할 수 있게 됩니다. 또한 WITH 절을 이용해 MySQL 서버의 리소스를 할당할 수 있습니다. 예를 들어 사용자가 시간당 사용할 수 있는 연결 수나 쿼리 수를 제한할 수 있으며, 이는 MySQL 공유 호스팅처럼 여러 사용자가 자원을 나눠 쓰는 환경에서 특히 유용합니다.
실전 예제
아래 예제에서는 사용자를 생성하고 권한을 부여하는 과정을 단계별로 살펴보겠습니다.
mysql> use mysql Database changed mysql> create user abcd@localhost identified by 'password123'; Query OK, 0 rows affected (0.04 sec)
다음 쿼리를 실행하면 새로 만든 사용자 계정 abcd@localhost의 현재 권한을 확인할 수 있습니다.
mysql> SHOW GRANTS FOR abcd@localhost; +------------------------------------------+ | Grants for abcd@localhost | +------------------------------------------+ | GRANT USAGE ON *.* TO 'abcd'@'localhost' | +------------------------------------------+ 1 row in set (0.01 sec)
출력 결과의 USAGE는 "권한 없음"을 의미합니다. 즉, 방금 생성한 사용자는 로그인 자격만 있을 뿐 실질적인 작업 권한은 전혀 없는 상태입니다.
이제 abcd@localhost 계정에 모든 권한을 부여하려면 다음 문장을 실행합니다.
mysql> GRANT ALL ON *.* TO 'abcd'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.05 sec)
여기서 ON *.* 구문은 모든 데이터베이스와 그 안의 모든 객체를 의미하며, WITH GRANT OPTION은 abcd@localhost가 다른 사용자에게 권한을 부여할 수 있도록 허용하는 역할을 합니다.
SHOW GRANTS 문을 다시 실행하면 abcd@localhost의 권한이 정상적으로 업데이트된 것을 확인할 수 있습니다.
mysql> SHOW GRANTS FOR abcd@localhost; +---------------------------------------------------------------------+ | Grants for abcd@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'abcd'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ 1 row in set (0.00 sec)
참고 : ALL PRIVILEGES와 WITH GRANT OPTION은 매우 강력한 권한 조합입니다. 운영 환경에서는 보안상의 이유로 필요한 최소한의 권한만 부여하고, 관리자급 권한은 신뢰할 수 있는 계정에만 제한적으로 사용하는 것이 좋습니다.