MySQL은 특이하게 어느 IP에서 접속하고 있는지도 확인한다.
'lee_id'@'127.0.0.1'
계정을 언급할 때는 다음과 같이 항상 아이디와 호스트를 함께 명시한다.
따옴표(')는 식별자를 감싸는 역할을 한다.
사용자 계정의 호스트 부분을 % 문자로 대체하면 된다.
즉, % 문자는 모든 IP 또는 모든 호스트명을 의미한다.
'lee_id'@'192.168.0.1' (비번 1234)
'lee_id'@'%' (비번 5678)
이 예시를 봤을 때 192.168.0.1과 %을 모두 가지고 있는 PC가 있다고 가정하자.
그러면 lee_id라는 계정으로 로그인하려 할 때 MySQL은 어떤 것을 서택할까?
하지만 이런 일이 생기지 않게 계정은 식별이 더 잘되게 다르게 만들자.
| 구분 | 시스템 계정 (System Account) | 일반 계정 (General/User Account) |
|---|---|---|
| 목적 | 시스템 운영 및 관리, 백그라운드 작업 수행 | 일반 사용자 서비스 이용 및 작업 수행 |
| 권한 수준 | 매우 높은 권한, 시스템 전체 접근 가능 | 제한된 권한, 주로 자신의 작업 영역 내에서만 권한 부여 |
| 생성 주체 | 시스템 관리자나 OS/DB 설치 시 자동 생성 | 관리자 또는 사용자 요청에 의해 생성 |
| 사용 주체 | OS, 데이터베이스, 애플리케이션 등 시스템 프로세스 | 실제 사용자(사람) |
| 접근 범위 | 시스템 전반, 여러 사용자 계정 관리 | 자신 또는 특정 리소스에 제한된 접근 |
| 예시 | root, administrator, mysql, postgres | alice, bob, guest |
| 보안 중요도 | 매우 높음, 계정 탈취 시 심각한 피해 우려 | 중요하지만 시스템 계정보다 상대적으로 낮음 |
5.7 버전에서는 GRANT 명령으로 권한의 부여와 동시에 계정 생서이 가능했다고 한다.
하지만 8.0 버전부터는 계정의 생성은 CREATE USER 명령으로, 권한 부여는 GRANT 명령으로 구분해서 실행하도록 바뀌었다.
설정할 수 있는 옵션
# 유저생성 예시
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;