본문 바로가기
IT

MySQL 사용자 계정 관리 - 1

by 힁구띠 2022. 9. 21.

1. 식별 관리

MySQL의 사용자 식별은 다른 DBMS와 조금 차이가 있다. 사용자의 계정뿐만 아니라 사용자의 접속 지점(클라이언트가 실행된 호스트명 도메인, IP 주소 등)도 계정의 일부가 된다. MySQL의 계정의 개념을 말할 때는 항상 아이디와 호스트를 함께 명시해야 한다. 아이디와 IP 주소를 감싸고 있는 역 따옴표 (`)는 MySQL에서 식별자를 감싸는 따옴표 역할을 하는데 홑 따옴표(')로 변경하여 사용하기도 한다. 아래 사용자 계정은 항상 MySQL 서버가 가동 중인 로컬 호스트에서 test_id라는 아이디로 접속할 때만 사용할 수 있는 계정이다. 만약 사용자 계정에 다음 계정만 등록돼 있다면 다른 컴퓨터에서는 test_id라는 아이디로 접속할 수 없다.

 

'test_id'@'127.0.0.1'

 

만약 외부에서 접속이 가능한 사용자 계정을 생성하려고 한다면 사용자 계정의 호스트 부분을 % 문자로 대체하면 된다. 즉, % 문자는 모든 IP 또는 모든 호스트명을 의미한다. 사용자 계정 식별에서 추가적으로 주의할  사항은 서로 동일한 아이디가 있을 때 MySQL 서버가 해당 사용자의 인증을 위해 어떤 계정을 선택하는지 이다.

 

'test_id'@'192.168.0.10' (계정 비밀번호 123)

'test_id'@'%' (계정 비밀번호 456)

 

IP 주소가 192.168.0.10 인 접속지에서 MySQL 서버에 접속할 때 MySQL 서버가 첫 번째 계정 정보를 사용해서 인증할지, 두 번째 계정 정보를 사용하여 인증할지에 따라 해당 접속은 성공이나 실패할 수도 있다. MySQL은 범위가 가장 작은 것을 항상 먼저 선택한다. 즉, 위 두 계정 정보에서 범위가 좁은 것은 %가 없는 'test_id'@'192.168.0.10'이기 때문에 IP가 명시된 계정 정보를 이용한 사용자를 인증하게 된다. 이 사용자 IP가 192.168.0.10인 접속지에서 'test_id'라는 아이디와 456이라는 비밀번호로 로그인하면 '비밀번호가 일치하지 않는다'라는 이유로 접속이 거부될 것이다. 의도적으로 이처럼 중첩된 계정을 생성하지 않겠지만 실수로 이와 같은 상황이 발생할 수 있으므로 식별 관리에 항상 주의해야 한다.

 

2. 시스템 계정 및 일반 계정

MySQL 8.0부터 계정은 SYSTEM_USER 권한을 가지고 있는지에 따라 시스템 계정과 일반 계정으로 나뉜다. 시스템 계정은 MySQL 서버 내부적으로 실행되는 백그라운드 스레드와 무관하며, 시스템 계정도 일반 계정과 같이 사용자를 위한 계정이다. 시스템 계정은 데이터베이스 서버 관리자를 위한 계정이며, 일반 계정은 응용 프로그램이나 개발자를 위한 계정이라고 할 수 있다.

시스템 계정과 일반 계정을 관리할  수 있지만 일반 계정은 시스템 계정을 관리할 수 없다. 또한 다음과 같이 데이터베이스 서버 관리와 관련된 중요 작업은 시스템 계정으로만 수행할 수 있다.

시스템 계정과 일반 계정의 개념이 도입된 것은 DBA 계정에는 SYSTEM_USER 권한을 할당하고 일반 사용자를 위한 계정에는 SYSTEM_USER 권한을 부여하지 않게 하기 위해서이다.

 

MySQL 서버에는 아래와 같이 내장된 계정들이 존재하는데, 'root'@'localhost'를 제외한 3개의 계정은 내부적으로 각기 다른 목적으로 사용되므로 삭제되지 않도록 주의해야 한다.

  • 'mysql.sys'@'localhost': MySQL 8.0부터 기본적으로 내장된 sys 스키마의 객체(뷰, 함수, 프로시저)의 DEFINER로 사용되는 계정
  • 'mySQL.session'@'localhost': MySQL 플러그인이 서버로 접근할 때 사용되는 계정
  • 'mysql.infoschema'@'localhost': information_schema에 정의된 뷰의 DEFINER로 사용되는 계정

위 3개의 계정은 account_locked 상태이므로 잠긴 계정을 풀지 않는 한 악의적인 용도로 사용할 수 없다.

 

3. 계정 생성

5.7 버전까지는 GRANT 명령으로 권한 부여 및 생성이 동시에 가능했다. 하지만 8.0 버전부터는 계정의 생성은 CREATE USER, 권한 부여는 GRANT 명령으로 구분해서 실행하도록 변경되었다. 계정을 생성할 때는 아래와 같은 옵션을 설정할 수 있다.

  • 계정의 인증 방식과 비밀번호
  • 비밀번호 관련 옵션(비밀번호 유효 기간, 비밀번호 이력 개수, 비밀번호 재사용 불가 기간)
  • 기본 역할(ROLE)
  • SSL 옵션
  • 계정 잠금 여부

이란적으로 많이 사용되는 옵션을 가진 CREATE USER 명령문은 아래와 같다.

 

CREATE USER 'user'@'%'

  IDENTIFIED WITH 'mysql_native_password' BY 'password'

  REQUIRE NONE

  PASSWORD EXPIRE INTERVAL 30 DAY

  ACCOUNT UNLOCK

  PASSWORD HISTORY DEFAULT

  PASSWORD REUSE INTERVAL DEFAULT

  PASSWORD REQUIRE CURRENT DEFAULT;

 

위에서 사용되는 각 옵션은 다음 'MySQL 사용자 계정 관리 - 2' 편에서 자세히 설명하도록 하겠다.

 

*참고: 보통 데이터베이스에서는 계정과 사용자라는 말을 혼용하여 사용하는데, 이번 편의 원활한 설명을 위해 '사용자', '계정'이라는 단어를 아래와 같이 구분해서 사용하겠다.

  • 사용자: MySQL 서버를 사용하는 주체 (사람 또는 응용 프로그램)
  • 계정: MySQL 서버에 로그인하기 위한 식별자 (로그인 아이디)

'IT' 카테고리의 다른 글

MySQL 아키텍처 - 2  (0) 2022.09.27
MySQL 아키텍처 - 1  (0) 2022.09.26
MySQL 정적 변수와 동적 변수  (0) 2022.09.19
CITUS DB - 기본 개념  (0) 2022.09.19
스파크 실행과 언어 API  (0) 2022.09.07

댓글