실행 컨텍스트 이해
실행 컨텍스트는 세션에 연결된 사용자나 로그인에 의해 결정되거나 모듈을 실행(호출)하여 결정됩니다. 실행 컨텍스트는 문을 실행하거나 작업을 수행할 수 있는 권한을 확인하는 데 사용되는 ID를 설정합니다. 실행 컨텍스트는 로그인 토큰과 사용자 토큰으로 된 보안 토큰 쌍으로 표시됩니다. 이 토큰은 해당 사용 권한을 검사하는 기본 및 보조 보안 주체와 토큰을 인증하는 데 사용되는 원본을 식별합니다. SQL Server 인스턴스에 연결하는 로그인에는 해당 계정으로 액세스할 수 있는 데이터베이스 수에 따라 하나의 로그인 토큰과 하나 이상의 사용자 토큰이 있습니다.
사용자 및 로그인 보안 토큰
사용자 또는 로그인 보안 토큰에는 다음이 포함됩니다.
- 주 ID 역할을 하는 하나의 서버 또는 데이터베이스 보안 주체
- 보조 ID 역할을 하는 하나 이상의 보안 주체
- 0개 이상의 인증자
- 기본 및 보조 ID의 권한 및 사용 권한
보안 주체는 SQL Server 리소스를 요청할 수 있는 개인, 그룹 및 프로세스입니다. 보안 주체는 영향을 미치는 범위에 따라 Windows 수준, SQL Server 수준 또는 데이터베이스 수준으로 분류됩니다. 자세한 내용은 보안 주체를 참조하십시오.
인증자는 토큰의 신뢰성을 보증하는 보안 주체, 인증서 또는 비대칭 키입니다. 대부분의 경우 토큰 인증자는 SQL Server 인스턴스입니다. 인증자에 대한 자세한 내용은 EXECUTE AS를 사용하여 데이터베이스 가장 확장을 참조하십시오. 인증서 및 비대칭 키에 대한 자세한 내용은 암호화 계층을 참조하십시오.
로그인 토큰은 SQL Server 인스턴스 전체에서 유효합니다. 이 토큰에는 해당 ID와 연관된 서버 수준 사용 권한과 모든 데이터베이스 수준 사용 권한이 검사되는 기본 및 보조 ID가 포함됩니다. 주 ID는 로그인 자체입니다. 보조 ID에는 규칙 및 그룹에서 상속된 사용 권한이 포함됩니다.
사용자 토큰은 특정 데이터베이스에 대해서만 유효합니다. 이 토큰에는 데이터베이스 수준 사용 권한이 검사되는 기본 및 보조 ID가 포함됩니다. 주 ID는 데이터베이스 사용자 자체입니다. 보조 ID에는 데이터베이스 역할에서 상속된 사용 권한이 포함됩니다. 사용자 토큰은 서버 역할 멤버 자격을 포함하지 않으며 서버 수준 public 역할에 부여된 것을 비롯하여 토큰에 있는 ID에 부여된 서버 수준 사용 권한을 인식하지 않습니다.
SQL Server 로그인 또는 사용자 계정이 명시적으로 생성된 경우 해당 계정에 대해 만든 로그인 또는 사용자 ID는 로그인 또는 사용자 토큰에서 주 ID로 사용됩니다. 보안 주체가 CONTROL SERVER 권한을 통해 SQL Server 인스턴스에 암시적으로 액세스하거나 데이터베이스에 액세스할 수 있는 경우에는 로그인 토큰에 있는 주 ID가 기본 public 역할입니다. 사용자 토큰에 있는 주 ID는 public입니다.
중요: |
---|
sysadmin 고정 서버 역할의 멤버는 항상 해당 사용자 토큰의 주 ID로 dbo를 가집니다. |
로그인 토큰 예
Mary는 자신의 Windows 계정인 MyDomain\Mary
에 매핑되는 SQL Server 로그인을 가지고 있습니다. Mary는 다음 문을 실행하여 자신에게 생성된 로그인 토큰에 대한 정보를 봅니다.
SELECT principal_id, sid, name, type, usage FROM sys.login_token;
GO
결과 집합은 다음과 유사합니다.
principal_id sid name type usage
------------ ----------- ------------- -------------- -------------
261 0x583EA MyDomain\Mary WINDOWS LOGIN GRANT OR DENY
2 0x02 public SERVER ROLE GRANT OR DENY
(2 row(s) affected)
결과 집합은 Mary의 Windows 계정이 해당 로그인 토큰에 대한 주 ID임을 보여 줍니다. Mary의 로그인 계정을 만들 때 생성된 principal_id는 로그인 토큰에서 기본 principal_id로 사용됩니다. Mary가 해당 기본 역할의 멤버이기 때문에 public 역할은 보조 ID로 표시됩니다. Mary가 다른 서버 수준 역할의 멤버인 경우에는 해당 역할도 보조 ID로 표시됩니다. 로그인 생성될 때 SQL Server 인스턴스가 Mary의 Windows 계정 유효성을 검사했습니다. 따라서 Mary가 SQL Server 인스턴스에 로그인하면 이 인스턴스가 Mary의 로그인 토큰 인증자입니다. SQL Server 인스턴스가 Mary의 로그인 토큰 인증자이기 때문에 보안 주체, 인증서 또는 비대칭 키와 같은 인증자는 쿼리에서 반환되지 않습니다.
사용자 토큰 예
Mary는 자신이 액세스할 수 있는 각 데이터베이스마다 하나의 사용자 토큰을 가지고 있습니다. 첫 번째 예에서 Mary는 master 데이터베이스에 연결됩니다. Mary는 다음 문을 실행하여 master 데이터베이스에서 자신에게 생성된 사용자 토큰에 대한 정보를 봅니다.
SELECT principal_id, sid, name, type, usage FROM sys.user_token;
GO
결과 집합은 다음과 유사합니다.
principal_id sid name type usage
------------ ----------- ------------- -------------- -------------
2 NULL guest SQL USER GRANT OR DENY
0 NULL public ROLE GRANT OR DENY
(2 row(s) affected)
결과 집합은 Mary가 master 데이터베이스의 명시적 사용자는 아니지만 대신 guest 계정을 통해 액세스할 수 있음을 보여 줍니다. Mary의 사용자 토큰에 대한 주 ID는 guest 사용자입니다. guest가 해당 기본 역할의 멤버이기 때문에 public 역할은 보조 ID로 표시됩니다. master 데이터베이스에서 Mary의 사용자 토큰에는 guest 사용자와 public 역할에 대한 데이터베이스 수준 권한 및 사용 권한이 모두 포함됩니다.
다음 예에서는 Sales 데이터베이스에 Mary의 명시적 사용자 계정이 생성되었습니다. 또한 이 데이터베이스의 db_ddladmin 고정 데이터베이스 역할에 Mary가 추가되었습니다. Mary는 Sales를 현재 데이터베이스로 사용하여 SELECT * FROM sys.user_token
을 다시 실행합니다.
결과 집합은 다음과 유사합니다.
principal_id sid name type usage
------------ ----------- ------------- -------------- -------------
5 0x36CC4BBD1 Mary SQL USER GRANT OR DENY
0 NULL public ROLE GRANT OR DENY
16387 NULL db_ddladmin ROLE GRANT OR DENY
이 결과 집합은 Sales 데이터베이스에서 Mary에게 생성된 사용자 토큰을 나타냅니다. Mary는 Sales 데이터베이스에 명시적 사용자로 추가되었기 때문에 주 ID로 표시됩니다. Mary가 속한 두 역할은 보조 ID로 표시됩니다. Mary의 사용자 토큰 인증자는 SQL Server 인스턴스입니다.
실행 컨텍스트 전환
SQL Server 2005에서 세션의 실행 컨텍스트는 EXECUTE AS 문에서 사용자나 로그인 이름을 지정하여 명시적으로 변경할 수 있습니다. 저장 프로시저, 트리거 또는 사용자 정의 함수와 같은 모듈의 실행 컨텍스트는 모듈 정의의 EXECUTE AS 절에서 사용자나 로그인 이름을 지정하여 암시적으로 변경할 수 있습니다. 실행 컨텍스트가 다른 사용자나 로그인으로 전환되는 경우 SQL Server는 해당 계정의 로그인 및 사용자 토큰에 대해 사용 권한을 검사합니다. 기본적으로 해당 계정은 세션이 열린 동안이나 모듈 생성 중에 가장됩니다. 자세한 내용은 컨텍스트 전환 이해 및 소유권 체인 및 컨텍스트 전환을 참조하십시오.
참고 항목
개념
관련 자료
컨텍스트 전환
EXECUTE(Transact-SQL)
EXECUTE AS(Transact-SQL)
EXECUTE AS 절(Transact-SQL)
sys.database_principals(Transact-SQL)
sys.server_principals(Transact-SQL)