다음을 통해 공유


어셈블리 보안 고려 사항

어셈블리를 빌드할 때 어셈블리를 실행하기 위해 필요한 권한을 지정할 수 있습니다. 어셈블리에 대한 특정 권한 부여 여부는 증명 정보를 바탕으로 합니다.

증명 정보를 사용하는 두 가지 방법은 다음과 같습니다.

  • 먼저 입력된 증명 정보를 로더에 의해 수집된 증명 정보와 결합하여 정책 결정에 사용할 최종 증명 정보를 만듭니다. 이 의미를 사용하는 메서드로는 Assembly.Load, Assembly.LoadFromActivator.CreateInstance 등이 있습니다.

  • 또 다른 방법은 입력된 증명 정보를 바꾸지 않고 정책 결정을 위한 최종 증명 정보로 사용하는 것입니다. 이 의미를 사용하는 메서드로는 Assembly.Load(byte[])AppDomain.DefineDynamicAssembly() 등이 있습니다.

선택적 옵션은 어셈블리가 실행될 컴퓨터에 설정된 보안 정책에서 부여 할 수 있습니다. 코드에서 모든 가능한 보안 예외를 처리하게 하려면 다음 중 하나를 수행해야 합니다.

  • 코드에 필요한 모든 권한에 대해 권한 요청을 삽입하고 권한이 부여되지 않았을 때 발생하는 로드 시간 오류를 먼저 처리합니다.

  • 코드에 필요할 수 있는 권한을 얻기 위한 권한 요청을 사용하지 않고, 대신 권한이 부여되지 않을 경우를 대비하여 보안 예외를 처리할 수 있도록 준비합니다.

    참고참고

    보안은 매우 복잡한 영역이기 때문에 선택할 수 있는 옵션도 다양합니다.자세한 내용은 주요 보안 개념을 참조하십시오.

로드 시, 어셈블리의 증명 정보는 보안 정책에 대한 입력으로 사용됩니다. 보안 정책은 사용자 정책 설정을 비롯하여 엔터프라이즈 및 컴퓨터의 관리자에 의해 설정되며 모든 관리 코드가 실행될 때 부여되는 권한 집합을 결정합니다. 보안 정책은 어셈블리의 게시자(서명 도구로 생성된 서명이 있는 경우), 어셈블리를 다운로드한 웹 사이트 및 영역(Internet Explorer 용어), 어셈블리의 강력한 이름 등에 대해 설정될 수 있습니다. 예를 들어, 컴퓨터 관리자는 특정 웹 사이트에서 다운로드되고 지정된 소프트웨어 회사에서 서명한 모든 코드가 컴퓨터의 데이터베이스에 액세스할 수 있지만 컴퓨터의 디스크에 쓰지는 못하도록 보안 정책을 설정할 수 있습니다.

강력한 이름의 어셈블리 및 서명 도구

서로 다르지만 상호 보완적인 두 가지 방법, 즉 강력한 이름을 사용하거나 .NET Framework 버전 1.0 및 1.1의 Signcode.exe(파일 서명 도구)나 그 이후 버전의 SignTool.exe(서명 도구)를 사용하여 어셈블리에 서명할 수 있습니다. 강력한 이름을 사용하여 어셈블리에 서명하면 어셈블리 매니페스트를 포함하는 파일에 공개 키 암호화가 추가됩니다. 이 방법을 사용하면 참조를 확인할 때 이름의 고유성이 보장되고 이름 스푸핑을 방지할 수 있으며, 호출자에게 ID가 제공됩니다.

그러나 강력한 이름으로는 신뢰도를 보장할 수 없기 때문에 Signcode.exe(파일 서명 도구)SignTool.exe(서명 도구)가 필요합니다. 두 가지 서명 도구를 사용하려면 게시자는 외부 기관에서 ID를 증명 받은 후 인증서를 얻어야 합니다. 이 인증서는 파일에 포함되며, 관리자는 이 인증서를 사용하여 코드의 신뢰 여부를 판단합니다.

어셈블리에 대해 강력한 이름과 Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)로 만든 디지털 서명을 모두 사용하거나 둘 중 하나만 사용할 수 있습니다. 두 서명 도구는 한 번에 파일 하나씩만 서명할 수 있는데, 다중 파일 어셈블리의 경우에는 어셈블리 매니페스트를 포함하는 파일에 서명하면 됩니다. 강력한 이름은 어셈블리 매니페스트를 포함하는 파일에 저장되지만 Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)로 만든 서명은 어셈블리 매니페스트가 들어 있는 PE(이식 가능한 실행) 파일의 예약된 슬롯에 저장됩니다. 강력한 이름의 사용 여부와는 상관없이, Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)를 사용하는 어셈블리에 대한 서명은 Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)에서 생성한 서명에 의존하는 신뢰 계층 구조가 이미 있는 경우나 정책에서 신뢰 체인에 대한 확인 없이 키 부분만 사용하는 경우에 사용할 수 있습니다.

참고참고

어셈블리에 강력한 이름과 서명 도구 서명을 모두 사용하는 경우, 강력한 이름을 먼저 지정해야 합니다.

또한 공용 언어 런타임에서는 해시를 확인합니다. 어셈블리 매니페스트에는 해당 어셈블리를 구성하는 모든 파일의 목록이 들어 있는데, 이 목록에는 매니페스트가 처음 빌드되었을 당시의 각 파일의 해시가 포함됩니다. 각 파일이 로드될 때 런타임에서는 각 파일의 해시된 내용과 매니페스트에 저장된 해시 값을 비교합니다. 만약 두 값이 일치하지 않으면 어셈블리가 로드되지 않습니다.

강력한 이름과 Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)를 사용하는 서명은 무결성을 보증하기 때문에 이 두 가지 어셈블리 증명 정보에 기반하여 기본 코드 액세스 보안 정책을 설정할 수 있습니다. 강력한 이름 및 Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)를 사용하는 서명은 디지털 서명 및 인증서를 통해 무결성을 보장합니다. 해시 확인, 강력한 이름, Signcode.exe(파일 서명 도구) 또는 SignTool.exe(서명 도구)를 사용하는 서명 등의 모든 기술은 어셈블리가 어떠한 방식으로든 변경되지 않도록 하는 데 사용됩니다.

참고 항목

참조

SignTool.exe(서명 도구)

Signcode.exe(파일 서명 도구)

개념

강력한 이름의 어셈블리

공용 언어 런타임의 어셈블리