서버 외부에서 원격으로 mysql에 접근하려면 원격 접속 권한을 가진 계정을 생성해야 합니다. mysql은 계정을 만들 때부터 엑세스 위치를 명시합니다.
MySQL 외부 접속 계정 생성
계정 생성
모든 외부 IP에서 접속이 가능하게 하려면 %를 사용합니다.
create user '유저명'@'%' identified by '비밀번호';
MariaDB [(none)]> create user 'user1'@'%' identified by 'user1';
Query OK, 0 rows affected (0.002 sec)
이렇게 만들면 user1 계정이 user1 비밀번호로 IP와 관계 없이 원격지에서 연결이 가능합니다.
특정 IP에서만 연결할 수 있도록 지정할 수도 있습니다.
MariaDB [(none)]> create user 'user1'@'192.168.221.1' identified by 'user1';
Query OK, 0 rows affected (0.001 sec)
헷갈리기 쉬운 게 하나 있습니다.
mysql에서 ‘user1’@’%’ 계정과 ‘user1’@’192.168.221.1’ 계정은 독립적입니다. 그러니까 user1 이라는 하나의 계정이 있고 그 계정에 접속 위치를 추가하는 개념이 아닙니다. 아래 결과를 보면 이해가 되실겁니다.
MariaDB [(none)]> select user, host from mysql.user;
+-------------+-----------------------+
| User | Host |
+-------------+-----------------------+
| PUBLIC | |
| user1 | % |
| user1 | 192.168.221.1 |
| | localhost |
| mariadb.sys | localhost |
| mysql | localhost |
| root | localhost |
| | localhost.localdomain |
+-------------+-----------------------+
8 rows in set (0.008 sec)
mysql 데이터베이스의 user 테이블을 보시면 user1 계정이 host로 구분해서 두 개 생성되어 있는 걸 확인할 수 있습니다.
권한 부여
다시 본론으로 돌아오겠습니다. 원격 연결이 가능한 계정을 생성했으면 이제 해당 계정이 어떤 데이터베이스에 접근할 수 있는지에 대한 권한을 부여합니다.
MariaDB [classicmodels]> show tables;
+-------------------------+
| Tables_in_classicmodels |
+-------------------------+
| customers |
| employees |
| offices |
| orderdetails |
| orders |
| payments |
| productlines |
| products |
+-------------------------+
8 rows in set (0.000 sec)
아래와 같은 형태로 grant 명령어를 사용합니다.
GRANT [부여할 권한] ON [DB명].[테이블명] TO [사용자]
classicmodels 데이터베이스의 customers 테이블에 대한 select 권한을 부여해보겠습니다.
MariaDB [classicmodels]> grant select on classicmodels.customers to 'user1'@'%';
Query OK, 0 rows affected (0.016 sec)
user1 계정으로 원격으로 접속 해보면 지정한 customers 테이블만 보이는 게 확인됩니다.
이런 방식으로 외부 사용자에게 제한적인 접근 권한을 부여할 수 있습니다. 서로 다른 솔루션 간 연동 작업을 할 때 타 업체에 DB 접근 권한을 줘야하면 이런 방식을 자주 사용합니다.
classicmodels 데이터베이스에 대해 모든 권한을 주려면 아래와 같이 권한을 부여합니다.
MariaDB [(none)]> grant all on classicmodels.* to 'user1'@'%';
Query OK, 0 rows affected (0.015 sec)