다음을 통해 공유


사용자 모드 초기화

분산(클라이언트/서버) 애플리케이션은 보안 패키지를 사용하여 인증된 연결을 가져오고 메시지를 교환합니다. 애플리케이션은 SSP/AP에서 구현하는 함수와 사용자 모드 SSP/AP에서 구현하는 함수에 매핑되는 SSPI(보안 지원 공급자 인터페이스) 함수를 호출합니다. 이 매핑은 클라이언트 및 서버 프로세스에 동적으로 로드할 수 있는 보안 공급자 DLL(Secur32.dll 또는 Security.dll)에 의해 수행됩니다. 또한 보안32.lib를 사용하여 DLL을 정적으로 연결할 수도 있습니다. DLL 및 LIB는 모두 Microsoft Windows SDK(소프트웨어 개발 키트)와 함께 제공됩니다.

보안 패키지가 포함된 SSP/AP DLL이 제대로 등록된 경우 보안 패키지를 클라이언트 또는 서버 프로세스에 로드하는 작업은 시스템에서 처리됩니다.

서버는 클라이언트가 메시지를 보낼 때까지 기다리며 포트를 모니터링하여 클라이언트와의 보안 연결을 가져오는 프로세스를 시작합니다. 클라이언트는 SSPI 함수 InitializeSecurityContext(일반)를 호출하여 서버에 대한 보안 연결을 가져오는 프로세스를 시작합니다. 이 함수는 사용자 지정 보안 패키지의 SpInitLsaModeContext 함수에 매핑됩니다. SpInitLsaModeContext 는 토큰을 서버에 전달하는 클라이언트에 반환합니다.

클라이언트에서 토큰을 받으면 서버는 보안 패키지의 SpAcceptLsaModeContext 함수로 디스패치되는 SSPI 함수 AcceptSecurityContext(일반)를 호출합니다. SpAcceptLsaModeContext 함수가 성공하고 보안 컨텍스트를 설정하는 데 더 이상 처리가 필요하지 않은 경우 함수는 호출자에게 STATUS_SUCCESS 반환해야 합니다. 추가 처리가 필요한 경우 함수는 SEC_I_CONTINUE_NEEDED 반환하고 토큰을 서버에 반환해야 합니다. 서버는 토큰을 클라이언트에 전달합니다. 클라이언트는 InitializeSecurityContext(일반) 를 다시 호출합니다.

이 호출 주기는 인증된 연결이 설정되거나 실패할 때까지 필요한 만큼 자주 반복될 수 있습니다. 이 프로세스 중에 SpAcceptLsaModeContext 또는 SpInitLsaModeContext 함수가 성공하고 보안 컨텍스트를 설정하는 데 더 이상 처리가 필요하지 않은 경우 함수는 호출자에게 STATUS_SUCCESS 반환해야 합니다. 추가 처리가 필요한 경우 함수는 SEC_I_CONTINUE_NEEDED 반환하고 전달을 담당하는 호출자에게 토큰을 반환해야 합니다.

보안 패키지에서 구현하는 프로토콜은 이 주기가 반복되는 횟수를 결정합니다. 예를 들어 3개 다리 상호 인증을 지원하는 보안 패키지에서 호출 시퀀스는 다음과 같습니다.

  1. 클라이언트는 InitializeSecurityContext(일반)를 호출하여 토큰을 가져와서 서버에 보냅니다. 서버는 처음으로 AcceptSecurityContext(일반) 를 호출하고 클라이언트에 보내는 회신 토큰을 다시 가져옵니다.
  2. 클라이언트는 InitializeSecurityContext(일반)에 대한 두 번째 호출에서 서버에서 받은 토큰을 사용하고 최종 토큰을 다시 가져옵니다. 클라이언트는 이 토큰을 서버로 보냅니다.
  3. 서버는 AcceptSecurityContext(일반)에 대한 최종 호출에서 사용하는 레그 2에서 생성된 토큰을 받습니다.

SpAcceptLsaModeContextSpInitLsaModeContext 함수가 성공하고 보안 컨텍스트를 설정하는 데 더 이상 처리가 필요하지 않은 경우 함수는 호출자에게 STATUS_SUCCESS 반환해야 합니다. 또한 사용자 지정 보안 패키지가 사용자 모드 SSP/AP로 구현된 함수를 지원하는 경우 SpAcceptLsaModeContextSpInitLsaModeContextMappedContext 매개 변수를 통해 TRUE를 반환해야 합니다. MappedContext 값은 애플리케이션에 다시 전달되지 않습니다. LSA에 의해 가로채집니다.

MappedContexttrue이면 LSA는 SSP/AP DLL의 SpUsermodeInitialize 함수를 호출합니다. 이 함수는 각 보안 패키지에서 구현하는 사용자 모드 함수에 대한 포인터 테이블을 제공합니다. 각 패키지의 SpInstanceInit 함수는 SpUsermodeInitialize에서 반환된 함수 테이블을 사용하여 호출됩니다. SpInstanceInit사용자 모드 SSP/AP에서 호출하는 LSA 함수에 대한 포인터 테이블을 받습니다.