2장
•
다양한 프로그래밍 언어가 ORM 도구를 지원합니다.
◦
ORM : Object Relational Mapping
•
그러나 ORM은 DBMS와의 상호작용을 블랙박스화하기 때문에, 실행되는 쿼리를 파악하기 어려울 수 있습니다.
•
성능은 비용이므로, ORM에만 의존하지 않고 DBMS에 대한 이해도를 키워야 합니다.
2.2.3 서버 연결 테스트
mysql -uroot -p --host=localhost --socket=/tmp/mysql.sock
mysql -uroot -p --host=localhost --port=3306
mysql -uroot -p
Shell
복사
•
다양한 형태의 명령행 인자를 이용해 접속을 시도할 수 있습니다.
•
첫 번째 방법은 MySQL 소켓 파일을 이용한 접속입니다.
•
두 번째 방법은 TCP/IP를 통해 127.0.0.1(로컬 호스트)로 접속하는 것입니다.
◦
일반적으로 포트를 명시합니다.
◦
이 방법은 로컬 서버에 설치된 MySQL이 아니라 원격 호스트에 있는 MySQL 서버에 접속할 때 사용합니다.
MySQL 서버에 접속할 때, 호스트를 localhost로 명시하는 것과 127.0.0.1로 명시하는 것은 서로 다른 의미를 가집니다.
•
host=localhost 옵션을 사용하면 항상 소켓 파일을 통해 접속합니다.
이 방법은 Unix domain socket을 이용하며, TCP/IP를 통한 통신이 아니라 유닉스의 프로세스간 통신(IPC; Inter Process Communication)을 이용합니다.
하지만 127.0.0.1 를 사용하는 경우에는 자기 서버를 가리키는 루프백(loopback) IP를 사용하지만, TCP/IP 통신 방법을 이용합니다.
•
세 번째 방법은 호스트 주소와 포트를 별도로 명시하지 않는 것입니다.
◦
이 경우, 기본값으로 호스트는 localhost가 되며 소켓 파일을 사용하게 됩니다.
▪
소켓 파일의 위치는 MySQL 서버의 설정 파일에서 확인할 수 있습니다.
◦
유닉스나 리눅스에서 mysql을 실행하는 경우에는 PATH(환경변수)에 등록해두는 것이 일반적입니다.
3장 사용자 및 권한
사용자 및 식별
MySQL의 사용자는 계정과 접속 지점이 모두 계정의 일부로 고려되는 점에서 다른 DBMS와는 약간 다릅니다.
아이디와 IP는 역따옴표(`)나 홑따옴표(')로 표현됩니다.
'hajun'@123.123.123.123
IP(도메인) 자리에는 % 특수문자가 들어갈 수도 있습니다. 이는 접속 지점을 구분하지 않는다는 것을 의미합니다.
접속하는 아이디, IP, 그리고 도메인에 따라 비밀번호가 다를 수 있으며, 같은 아이디가 있을 때 접속 지점이 좁을수록 우선순위가 높습니다.
`hajun`@`123.123.123.123` --password: 1234
`hajun`@`%` --password: 456
=> 아이피가 123.123.123.123 컴퓨터에서 접속할 때
비밀번호는 1234이고,
그 외에는 456.
Python
복사
3.2 사용자 계정 관리
3.2.2 계정 생성
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;
SQL
복사
•
IDENTIFIED WITH
◦
사용자의 인증 방식과 비밀번호를 설정합니다.
기본적으로 Caching SHA-2 Authentication이 사용됩니다.
MySQL 서버의 Caching SHA-2 Pluggable Authentication은 SCRAM
(Salted Challenge Response Authentication Mechanism)
을 기반으로 합니다.
•
REQUIRE
◦
암호화된 SSL/TLS 채널의 사용 여부를 설정합니다.
•
PASSWORD EXPIRE
◦
암호의 유효 기간을 설정합니다.
•
PASSWORD HISTORY
◦
한 번 사용했던 비밀번호를 재사용하지 못하게 설정하는 옵션이며, mysql.password_history에서 확인 가능합니다.
SELECT * FROM mysql.password_history;
SQL
복사
•
PASSWORD REUSE INTERVAL
◦
한 번 사용했던 비밀번호의 재사용 금지 기간을 설정합니다.
•
PASSWORD REQUIRE
◦
비밀번호 변경시 기존 비밀번호 입력 여부 결정 설정
•
ACCOUNT LOCK/UNLOCK
◦
계정의 잠금/비잠금 여부 설정
3.3 비밀번호 관리
•
고수준 비밀번호
◦
비밀번호의 복잡도에 대한 레벨을 글로벌 설정 변수로 설정한다. 관련된 컴포넌트의 설치가 필요하다.
◦
LOW: 길이만 검증
◦
MEDIUM: 길이와 숫자, 대소문자, 특수문자 배합 검증
◦
STRONG: 길이와 숫자, 대소문자, 특수문자 배합, 금칙어 포함 여부 검증이 결정된다.
•
•
이중 비밀번호
◦
이미 특정 계정으로 서비스 중일 경우 비밀번호의 변경이 제한 될 수 있다. 이때 비밀번호를 이중으로 함으로써 기존 서비스에 영향을 주지 않고 비밀번호를 변경하는 것이 가능하다.
3.4 권한(Privilege)
•
5.7 버전까지 권한은 전역 권한과 객체 단위의 권한으로 구분되었습니다.
◦
전역 권한: 데이터베이스나 테이블 외의 객체에 적용되는 권한
◦
객체 권한: 데이터베이스나 테이블을 제어하는 데 필요한 권한
•
객체 권한은 특정 객체를 명확히 지정해야 하지만, 전역 권한은 특정 객체를 지정하지 않아야 합니다.
•
ALL 키워드는 객체 권한에서는 특정 객체에 대한 모든 권한을 의미하며, 전역 권한에서는 전역 수준에서 가능한 모든 권한을 의미합니다.
•
MySQL 8.0 부터는 기존의 권한을 정적 권한으로 구분하고, 컴포넌트 또는 플러그인이 설치되면 그때 부여되는 권한들을 동적 권한으로 구분하였습니다.
•
MySQL 5.7 때는 SUPER라는 권한이 데이터베이스 권한에 반드시 필요했지만, MySQL 8.0 부터는 SUPER 권한이 세분화되었습니다.
•
컬럼 단위에 대한 권한 부여가 가능하지만, 이는 권한 검증으로 인해 성능에 영향을 미칠 수 있으므로 컬럼 단위 권한 관리는 안티 패턴입니다.
•
권한 부여 현황은 mysql 데이터베이스 내 관련 테이블을 통해 확인할 수 있습니다
3.5 역할(Role)
•
권한을 묶어서 역할을 사용할 수 있게 되었습니다.
CREATE ROLE
role_emp_read,
role_emp_write;
GRANT SELECT ON employees.* TO role_emp_read;
GRANT INSERT, UPDATE, DELETE ON employees.* TO role_emp_write;
SQL
복사
위의 예시처럼 역할을 생성할 수 있습니다.
CREATE USER 'reader'@'127.0.0.1' IDENTIFIED BY 'password';
CREATE USER 'writer'@'127.0.0.1' IDENTIFIED BY 'password';
GRANT role_emp_read TO 'reader'@'127.0.0.1';
GRANT role_emp_write TO 'writer'@'127.0.0.1';
SQL
복사
위의 예시처럼 계정을 생성하고 역할을 부여할 수 있습니다.
•
서버의 역할은 사용자 계정과 유사한 모습을 보입니다.
◦
서버 내부적으로 역할과 계정은 동일한 객체로 취급됩니다.
◦
역할과 사용자의 차이는 계정의 잠금 여부이며 역할이 기본적으로 계정이 잠겨 있는 반면, 사용자는 잠겨 있지 않습니다.
•
기본 잠금도 activate_all_roles_on_login 이란 시스템 변수를 변경하며 역할의 초기화시 로그인이 가능하도록 설정할 수 있습니다