클라우드 네이티브 애플리케이션용 IdentityServer

이 콘텐츠는 Azure용 클라우드 네이티브 .NET 애플리케이션 설계 eBook 에서 발췌한 것으로, .NET 문서에서 제공되거나 오프라인 상태에서도 읽을 수 있는 PDF(무료 다운로드 가능)로 제공됩니다.

Cloud Native .NET apps for Azure eBook cover thumbnail.

IdentityServer는 ASP.NET Core에 대한 OIDC(OpenID Connect) 및 OAuth 2.0 표준을 구현하는 인증 서버입니다. 웹, 네이티브, 모바일 또는 API 엔드포인트 등 모든 애플리케이션에 대한 요청을 인증하는 일반적인 방법을 제공하도록 설계되었습니다. IdentityServer를 사용하여 여러 애플리케이션 및 애플리케이션 유형에 대한 SSO(Single Sign-On)를 구현할 수 있습니다. 로그인 양식 및 유사한 사용자 인터페이스뿐만 아니라 일반적으로 사용자 인터페이스 없이 토큰 발급, 확인, 갱신을 포함하는 서비스 기반 인증을 통해 실제 사용자를 인증하는 데 사용할 수 있습니다. IdentityServer는 사용자 지정 가능한 솔루션으로 설계되었습니다. 각 인스턴스는 일반적으로 개별 조직 및/또는 애플리케이션의 요구 사항에 맞게 사용자 지정됩니다.

일반적인 웹앱 시나리오

일반적으로 애플리케이션은 다음 시나리오의 일부 또는 전부를 지원해야 합니다.

  • 브라우저를 사용하여 웹 애플리케이션에 액세스하는 사용자
  • 브라우저 기반 앱에서 백 엔드 웹 API에 액세스하는 사용자
  • 백 엔드 웹 API에 액세스하는 모바일/네이티브 클라이언트의 사용자
  • 백 엔드 웹 API에 액세스하는 다른 애플리케이션(활성 사용자 또는 사용자 인터페이스 제외)
  • 모든 애플리케이션은 자체 ID를 사용하거나 사용자 ID를 위임하여 다른 웹 API와 상호 작용해야 할 수 있습니다.

Application types and scenarios

그림 8-1. 애플리케이션 유형 및 시나리오

이러한 각 시나리오에서 노출된 기능은 무단 사용으로부터 보호되어야 합니다. 최소 리소스에 대한 요청을 만드는 사용자 또는 보안 주체를 인증해야 합니다. 이 인증은 SAML2p, WS-Fed 또는 OpenID 커넥트 같은 몇 가지 일반적인 프로토콜 중 하나를 사용할 수 있습니다. API와 통신하는 것은 일반적으로 OAuth2 프로토콜 및 보안 토큰 지원을 사용합니다. 이러한 중요한 교차 차단 보안 문제 및 구현 세부 정보를 애플리케이션 자체와 분리하면 일관성이 보장되고 보안 및 유지 관리 효율성이 향상됩니다. 이러한 문제를 IdentityServer와 같은 전용 제품에 아웃소싱하면 모든 애플리케이션이 이러한 문제 자체를 해결하는 데 도움이 됩니다.

IdentityServer는 ASP.NET Core 애플리케이션 내에서 실행되는 미들웨어를 제공하고 OpenID Connect 및 OAuth2에 대한 지원을 추가합니다(지원되는 사양 참조). 조직에서는 IdentityServer 미들웨어를 사용하여 자체 ASP.NET Core 앱을 만들어 모든 토큰 기반 보안 프로토콜에 대한 STS 역할을 합니다. IdentityServer 미들웨어는 다음을 비롯한 표준 기능을 지원하기 위해 엔드포인트를 노출합니다.

  • 권한 부여(최종 사용자 인증)
  • 토큰(프로그래밍 방식으로 토큰 요청)
  • 검색(서버에 대한 메타데이터)
  • 사용자 정보(유효한 액세스 토큰을 사용하여 사용자 정보 가져오기)
  • 디바이스 권한 부여(디바이스 흐름 권한 부여를 시작하는 데 사용됨)
  • 검사(토큰 유효성 검사)
  • 해지(토큰 해지)
  • 세션 종료(모든 앱에서 Single Sign-Out 트리거)

시작하기

IdentityServer4는 이중 라이선스로 사용할 수 있습니다.

  • RPL - 오픈 소스 작업에서 사용되는 경우 IdentityServer4를 무료로 사용할 수 있습니다.
  • 유료 - 상용 시나리오에서 IdentityServer4를 사용할 수 있습니다.

가격 책정에 대한 자세한 내용은 가격 책정 페이지를 참조하세요.

NuGet 패키지를 사용하여 애플리케이션에 추가할 수 있습니다. 기본 패키지는 IdentityServer4로, 400만 번 이상 다운로드되었습니다. 기본 패키지에는 사용자 인터페이스 코드가 포함되지 않으며 메모리 내 구성만 지원합니다. 데이터베이스와 함께 사용하려면 Entity Framework Core를 사용하여 IdentityServer에 대한 구성 및 운영 데이터를 저장하는 IdentityServer4.EntityFramework와 같은 데이터 공급자도 필요합니다. 사용자 인터페이스의 경우 빠른 시작 UI 리포지토리의 파일을 ASP.NET Core MVC 애플리케이션으로 복사하여 IdentityServer 미들웨어를 사용하여 로그인 및 로그아웃에 대한 지원을 추가할 수 있습니다.

구성

IdentityServer는 각 사용자 지정 설치의 일부로 구성할 수 있는 다양한 종류의 프로토콜 및 소셜 인증 공급자를 지원합니다. 이는 일반적으로 ASP.NET Core 애플리케이션의 Program 클래스(또는 ConfigureServices 메서드의 Startup 클래스)에서 수행됩니다. 구성에는 지원되는 프로토콜, 사용할 서버, 엔드포인트에 대한 경로를 지정하는 작업이 포함됩니다. 그림 8-2는 IdentityServer4 빠른 시작 UI 프로젝트에서 가져온 예제 구성을 보여 줍니다.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // some details omitted
        services.AddIdentityServer();

          services.AddAuthentication()
            .AddGoogle("Google", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                options.ClientId = "<insert here>";
                options.ClientSecret = "<insert here>";
            })
            .AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                options.Authority = "https://demo.identityserver.io/";
                options.ClientId = "implicit";
                options.ResponseType = "id_token";
                options.SaveTokens = true;
                options.CallbackPath = new PathString("/signin-idsrv");
                options.SignedOutCallbackPath = new PathString("/signout-callback-idsrv");
                options.RemoteSignOutPath = new PathString("/signout-idsrv");

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role"
                };
            });
    }
}

그림 8-2. IdentityServer 구성

JavaScript 클라이언트

많은 클라우드 네이티브 애플리케이션이 프런트 엔드에서 서버 쪽 API 및 다양한 클라이언트 SPA(단일 페이지 애플리케이션)를 사용합니다. IdentityServer는 NPM을 통해 JavaScript 클라이언트(oidc-client.js)를 제공합니다. 이 클라이언트는 웹 API의 로그인, 로그아웃, 토큰 기반 인증에 IdentityServer를 사용할 수 있도록 SPA에 추가할 수 있습니다.

참조