다음을 통해 공유


WCF RIA Services 보안

이 항목에서는 도메인 서비스의 안전한 사용을 보장하기 위한 지침을 제공합니다. EnableClientAccessAttribute 특성을 적용하여 도메인 서비스를 노출하면 노출된 네트워크의 모든 사용자가 도메인 서비스를 사용할 수 있습니다. 클라이언트 응용 프로그램이 도메인 서비스에 액세스할 유일한 응용 프로그램이라고 가정할 수는 없습니다. 이 고려 사항은 공용 네트워크에서 특히 중요하지만 중요한 데이터가 노출되는 경우 회사 네트워크와 같은 제한된 네트워크에서도 중요합니다.

새 도메인 서비스 클래스 추가 대화 상자에서는 도메인 서비스 작업을 시작하는 데 도움을 주기 위한 코드를 생성합니다. 생성된 코드는 배포할 준비가 되어 있지 않을 수도 있으므로 코드를 검토하고 응용 프로그램의 보안 요구 사항을 충족하도록 수정해야 합니다. 특히 네트워크의 모든 사용자가 사용할 수 있도록 할 작업을 고려해야 합니다. 도메인 서비스의 안전한 사용을 보장하기 위해 먼저 다음 검사 목록을 사용할 수 있습니다.

보안 검사 목록

도메인 서비스의 안전한 사용을 보장하려면 다음 지침을 고려하십시오.

  1. 도메인 서비스에서 노출하는 데이터와 작업을 최소화합니다. 이는 정보 공개와 서비스 거부에 대한 첫 번째 방어선입니다.

    1. 클라이언트에 필요한 엔터티만 노출합니다. 이를 위해 서버 논리 및 유효성 검사와 클라이언트 논리 및 유효성 검사를 분리하여 노출된 엔터티 수를 줄여야 할 수 있습니다. 예를 들어 클라이언트에서 Employee 엔터티가 필요하지 않은 비용 보고서 응용 프로그램은 도메인 서비스를 통해 Employee 엔터티를 노출하지 않아야 합니다.

    2. 중요한 데이터의 노출을 방지하도록 엔터티의 모양을 설정합니다. ExcludeAttribute 특성 또는 프레젠테이션 모델을 사용하여 클라이언트에서 사용할 수 있는 데이터를 줄일 수 있습니다. 예를 들어 생일과 주민 등록 번호가 응용 프로그램에서 필요하지 않으면 클라이언트에 표시되는 모양에서 생일과 주민 등록 번호를 제외합니다.

    3. 쿼리 메서드에서 LINQ의 데이터 필터링 기능에 의존하는 대신 응용 프로그램에서 필요한 매개 변수를 사용하도록 합니다. 예를 들어 지정된 직원에 대한 비용 보고서가 표시되는 경우 쿼리 메서드에서 직원 ID를 매개 변수로 사용해야 하며 모든 비용 보고서를 가져오는 메서드를 제공하지 않아야 합니다. 이렇게 하면 모든 직원에 대한 데이터를 수집할 가능성이 최소화됩니다.

    4. 응용 프로그램에서 특정 시나리오에 필요한 데이터만 제공하는 쿼리 메서드를 만듭니다. 이 경우 모든 데이터를 반환하는 단일 쿼리 메서드 대신 데이터의 일부를 반환하는 여러 쿼리 메서드를 제공할 수 있습니다. 예를 들어 제품이 범주 또는 공급업체별로 표시되는 경우 모든 제품을 반환하는 단일 메서드 대신 범주 또는 공급업체 정보를 사용하는 두 메서드를 제공할 수 있습니다.

    5. 응용 프로그램에 일반적으로 필요한 데이터만 제공하도록 데이터를 필터링합니다. 예를 들어 작년에 이행된 주문만 반환하는 쿼리 메서드를 사용할 수 있습니다.

    6. 쿼리에서 반환될 수 있는 결과 수를 제한하여 서버의 우연한 오버로드나 고의적인 오버로드를 최소화합니다. QueryAttribute에서 ResultLimit 속성을 사용하여 반환될 수 있는 결과 수를 제한합니다. 예를 들어 많은 수의 제품이 반환될 수 있는 경우 결과를 20개로 제한하여 클라이언트에서 페이징을 적용합니다. 또한 출력 캐싱에 OutputCacheAttribute 특성을 사용하여 중간 계층 및 데이터베이스에서 부하를 줄일 수도 있습니다.

    7. 각 노출된 엔터티에 대한 작업 수를 최소화합니다. 예를 들어 주문 응용 프로그램에서 주문을 추가하거나 수정하기만 하면 되는 경우 주문 엔터티에 대한 쿼리, 삽입 및 업데이트 작업을 노출하고 삭제 작업은 노출하지 않아야 합니다. 또한 제품 엔터티에 대한 쿼리 작업만 노출하고 데이터 수정 작업은 노출하지 않아야 합니다.

    8. 가능한 경우에는 언제나 업데이트될 수 있는 멤버를 제한하는 명명된 업데이트 메서드를 사용합니다.

  2. 데이터 및 작업 액세스를 특정 역할의 인증된 사용자로 제한합니다.

    1. 가능한 경우에는 언제나 RequiresAuthenticationAttribute 특성을 사용하여 익명 액세스를 방지합니다. 익명 액세스를 허용해야 하면 도메인 서비스의 가장 작은 집합과 해당 도메인 서비스에 있는 작업의 가장 작은 하위 집합으로 익명 액세스를 제한합니다.

    2. 가능한 경우에는 언제나 작업별 RequiresRoleAttribute 특성을 추가합니다. 도메인 서비스에서 각 작업을 개별적으로 고려하십시오. 예를 들어 모든 사용자가 제품 엔터티를 쿼리해야 할 수 있지만 관리자 역할의 사용자만 제품 엔터티를 업데이트해야 합니다.

    3. AuthorizationContext 속성을 사용하여 사용자 지정된 권한 부여 모델을 제공하는 것이 좋습니다.

    4. 클라이언트에서 보낸 모든 데이터를 의심스러운 데이터로 취급합니다. 악의적인 클라이언트(인증되고 권한이 부여된 클라이언트도 포함)는 변경 집합의 현재 값과 원래 값에 대해 변조된 값을 제공할 수 있습니다. 응용 프로그램 논리에서는 이러한 값을 신뢰할 수 있는 값으로 가정하지 않아야 합니다. 대신 변조된 원래 값에서 잠재적인 위협 요인을 고려하십시오.

  3. 폼 인증에 https 프로토콜을 사용합니다. 일반 텍스트로 암호를 보내면 보안상 상당히 취약하지만 https를 사용하면 취약성을 완화할 수 있습니다.

  4. 최소한의 끝점을 노출합니다. 기본적으로 RIA Services 에서는 도메인 서비스에 대한 이진 끝점을 만듭니다. 특정하게 끝점이 필요한 클라이언트가 있는 경우에만 추가 끝점을 추가하고, 사용하지 않는 끝점을 모두 사용할 수 없도록 설정하십시오. 

참고 항목

기타 리소스

Silverlight 보안
ASP.NET 보안