6.2.5 액세스 제어, 2 단계 : 요청 확인
연결이 된 후 서버는 액세스 제어의 2 단계로 들어갑니다. 연결을 통해 사용자가 발행하는 각 요청에 대해 서버는 사용자가 수행 할 작업을 결정하고 작업을 할 충분한 권한을 사용자에게 부여할지 여부를 검사합니다. 여기에서 부여 테이블의 권한 컬럼이 도움이됩니다. 이러한 권한은 user
, db
, tables_priv
, columns_priv
또는 procs_priv
테이블에서 검색 될 수 있습니다. (각각 부여 테이블에있는 컬럼의 목록을 보여주는 섹션 6.2.2 "권한 시스템 부여 테이블" 을 참조하면 도움이 될 수 있습니다.)
user
테이블은 사용자에 글로벌에 할당 기본 데이터베이스에 관계없이 적용되는 권한을 부여합니다. 예를 들어, user
테이블에서 사용자에게 DELETE
권한이 부여 된 경우 해당 서버 호스트의 모든 데이터베이스의 모든 테이블의 행을 삭제할 수 버립니다. user
테이블의 권한은 데이터베이스 관리자 등의 권한을 필요로하는 사용자에게만 부여하는 것이 현명하다. 다른 사용자는 user
테이블의 모든 권한을 'N'
으로 설정하여두고, 구체적인 수준에서만 권한을 부여하도록합니다. 특정 데이터베이스, 테이블, 열 또는 루틴에 대한 권한을 부여 할 수 있습니다.
db
테이블은 데이터베이스 고유 권한을 부여합니다. 이 테이블의 범위 컬럼의 값은 다음의 형식을 취할 수 있습니다.
공백의
User
값은 익명 사용자에 일치합니다. 공백이 아닌 값은 문자 그대로 일치하고 사용자 이름에 와일드 카드가 없습니다.Host
와Db
컬럼 내에서 와일드 카드 문자 '%
'및'_
'를 사용하실 수 있습니다. 이들은LIKE
연산자에서 실행되는 패턴 매칭 연산과 같은 의미를가집니다. 권한을 부여 할 때 모든 문자를 문자 그대로 사용하는 경우, 문자를 backslash로 이스케이프해야합니다. 예를 들어, 데이터베이스 이름의 일부로 밑줄 ( "_
")를 포함하려면GRANT
문에서 이것을 "\_
"로 지정합니다.'%'
또는 공백의Host
값은 "모든 호스트"를 의미합니다.'%'
또는 공백의Db
값은 "모든 데이터베이스"를 의미합니다.
서버는 user
테이블을 읽는 것과 동시에 db
테이블을 메모리에 읽어 정렬합니다. 서버는 Host
, Db
, 그리고 User
범위 컬럼에 따라 db
테이블을 정렬합니다. user
테이블처럼 정렬은 가장 구체적인 값이 먼저 배치되고, 가장 구체적이지 않은 값이 마지막에 배치되고 서버가 일치하는 항목을 참조 할 때 발견 된 최초의 일치가 사용 됩니다.
tables_priv
, columns_priv
및 procs_priv
테이블은 테이블 별 컬럼 별 및 루틴 고유의 권한을 부여합니다. 이러한 테이블의 범위 컬럼 값은 다음 형식을 취할 수 있습니다.
Host
컬럼에서 와일드 카드 문자 '%
'및'_
'를 사용하실 수 있습니다. 이들은LIKE
연산자에서 실행되는 패턴 매칭 연산과 같은 의미를가집니다.'%'
또는 공백의Host
값은 "모든 호스트"를 의미합니다.Db
,Table_name
,Column_name
및Routine_name
컬럼은 와일드 카드를 포함하거나 공백으로 할 수 없습니다.
서버는 Host
, Db
, 및 User
컬럼에 따라 tables_priv
, columns_priv
및 procs_priv
테이블을 정렬합니다. 이것은 db
테이블의 정렬과 비슷하지만 Host
컬럼 만 와일드 카드를 포함 할 수 있기 때문에보다 간단합니다.
서버는 정렬 된 테이블을 사용하여 서버가 수신 요청을 확인합니다. SHUTDOWN
과 RELOAD
등의 관리 권한이 필요한 요청이 서버는 user
테이블 행만을 체크합니다. 이것은 관리 권한을 지정하는 것은이 테이블뿐이기 때문입니다. 요청 된 조작이 그 행에 의해 허용 된 경우 서버는 액세스 권한을 부여하고, 그렇지 않은 경우 액세스를 거부합니다. 예를 들어, 사용자가 mysqladmin shutdown을 실행하고 싶지만, user
테이블 행에 의해 SHUTDOWN
권한이 부여되어 있지 않은 경우, 서버는 db
테이블조차도 확인하지 않고 액세스를 거부합니다. (여기에는 Shutdown_priv
열이 없기 때문에 실행하지 않아도됩니다.)
데이터베이스 관련 요청 ( INSERT
, UPDATE
등)의 경우, 서버는 user
테이블 행을 참조하여 사용자의 전역 권한을 먼저 확인합니다. 요청 된 조작이 행이 허용되는 경우 액세스 권한이 부여됩니다. user
테이블의 글로벌 권한이 충분하지 않은 경우, 서버는 db
테이블을 선택하여 사용자의 데이터베이스 고유의 권한을 확인합니다.
서버는 db
테이블을 참조 Host
, Db
, 및 User
컬럼의 일치가 있는지 확인합니다. Host
와 User
컬럼 연결하는 사용자의 호스트 이름과 MySQL 사용자 이름에 일치됩니다. Db
컬럼은 사용자가 액세스하려고하는 데이터베이스에 일치됩니다. Host
와 User
에 해당하는 행이없는 경우 액세스가 거부됩니다.
db
테이블 엔트리에 의해 부여되는 데이터베이스 고유의 권한을 판별 한 후 서버는 user
테이블에 의해 부여되는 글로벌 권한에 그 권한을 추가합니다. 그 결과, 요청 된 조작이 허가되는 경우 액세스 권한이 부여됩니다. 그렇지 않은 경우, 서버는 계속 tables_priv
와 columns_priv
테이블에서 사용자의 테이블 권한과 컬럼 권한을 확인하고이를 사용자의 권한에 추가하고 결과에 따라 액세스를 허용하거나 거부합니다. 스토어드 루틴 조작의 경우, 서버는 tables_priv
와 columns_priv
대신 procs_priv
테이블을 사용합니다.
boolean 조건으로 표현하면 사용자의 권한을 계산하는 방법에 대한 전술의 설명은 다음과 같이 요약 할 수 있습니다.
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges OR routine privileges
요청 된 작업에 user
행 글로벌 권한은 처음에 충분하지 것을 알고있는 경우 서버가 그 권한을 나중에 데이터베이스 권한 테이블 권한과 컬럼 권한과 결합의 이유가 불명확 않을지도 모릅니다. 그 이유는 하나의 요청이 여러 유형의 권한을 필요로 할 수 있기 때문입니다. 예를 들어, INSERT INTO ... SELECT
문을 실행하는 경우 INSERT
및 SELECT
권한이 모두 필요합니다. 사용 권한이 user
테이블 행에 하나의 권한을 부여하고 db
테이블 행에서 또 다른 권한을 부여하도록되어있는 경우가 있습니다. 이 상황에서 요청을 실행하는 데 필요한 권한은 있지만 서버는 어느 테이블에서 온 것인지를 알 수없이 두 테이블의 항목에 의해 부여 된 권한을 결합해야합니다.