Search

2 ~ 3장

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: 길이와 숫자, 대소문자, 특수문자 배합, 금칙어 포함 여부 검증이 결정된다.
금칙어의 경우 고수가 만든걸 가져다 쓰자.
최범균님의 TDD로 암호 검사기를 만드는 영상을 참고하십시오.
사용 언어: Java( 비밀번호 TDD_레포지터리 )
이중 비밀번호
이미 특정 계정으로 서비스 중일 경우 비밀번호의 변경이 제한 될 수 있다. 이때 비밀번호를 이중으로 함으로써 기존 서비스에 영향을 주지 않고 비밀번호를 변경하는 것이 가능하다.

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 이란 시스템 변수를 변경하며 역할의 초기화시 로그인이 가능하도록 설정할 수 있습니다