권한부여: 역할 기반 권한부여

등록일시: 2017-01-14 14:00,  수정일시: 2017-01-20 11:11
조회수: 6,027
이 문서는 ASP.NET Core 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 Authorize 어트리뷰트를 이용한 역할 기반 권한부여 방식과 새로 도입된 정책(Policy) 기능의 활용방법을 살펴봅니다.

신원(Identity)을 생성할 때 해당 신원에 하나 이상의 역할을 부여할 수 있습니다. 가령, Tracy 에게는 Administrator 역할과 User 역할을 동시에 부여하고 Scott 에게는 User 역할만 부여할 수 있습니다. 이런 역할들이 생성되고 관리되는 방식은 권한부여 절차에 사용되는 백업 저장소에 따라 달라집니다. 개발자는 ClaimsPrincipal 클래스의 IsInRole 속성을 이용해서 역할에 접근할 수 있습니다.

역할 검사 추가하기

역할 기반의 권한 검사는 선언적인 방식으로 구성됩니다. 개발자는 요청된 리소스에 사용자가 접근하기 위해서 필요한 역할을 컨트롤러나 컨트롤러 액션 코드에 지정하는 방식으로 역할 기반 권한 검사를 구현합니다.

가령, 다음 코드는 Administrator 그룹에 포함된 사용자만 AdministrationController의 모든 액션에 접근할 수 있게 제한합니다:

[Authorize(Roles = "Administrator")]
public class AdministrationController : Controller
{
}

다음과 같이 쉼표(,)로 연결된 목록을 전달해서 다수의 역할을 지정할 수도 있습니다:

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}

이 컨트롤러는 HRManager 역할이나 Finance 역할을 부여 받은 사용자만 접근할 수 있습니다.

동시에 여러 개의 어트리뷰트를 적용하면 지정된 역할들을 모두 부여 받은 사용자만 리소스에 접근할 수 있습니다. 예를 들어, 다음 예제는 PowerUser 역할과 ControlPanelUser 역할을 모두 부여 받은 사용자만 컨트롤러에 접근할 수 있도록 제한합니다:

[Authorize(Roles = "PowerUser")]
[Authorize(Roles = "ControlPanelUser")]
public class ControlPanelController : Controller
{
}

역할 권한부여 어트리뷰트를 액션 수준에 추가로 적용해서 접근을 더욱 제한할 수도 있습니다:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

이 예제 코드에서 Administrator 역할이나 PowerUser 역할을 부여 받은 사용자는 컨트롤러와 SetTime 액션에 접근할 수 있습니다. 그러나 ShutDown 액션은 Administrator 역할을 부여 받은 사용자만 접근이 가능합니다.

또는 컨트롤러 자체는 잠그고, 개별 액션만 인증되지 않은 익명 사용자에게 접근을 허용할 수도 있습니다:

[Authorize]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [AllowAnonymous]
    public ActionResult Login()
    {
    }
}

정책 기반의 역할 검사

응용 프로그램 구동시 Authorization 서비스 구성의 일부로 개발자가 등록한 정책을 사용하는 새로운 Policy 구문을 활용해서 역할 요구사항을 표현할 수도 있습니다. 일반적으로 이 작업은 Startup.cs 파일의 ConfigureServices() 메서드에서 수행됩니다:

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

    services.AddAuthorization(options =>
    {
        options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Administrator"));
    });
}

이렇게 등록된 정책은 Authorize 어트리뷰트의 Policy 속성을 통해서 적용됩니다:

[Authorize(Policy = "RequireAdministratorRole")]
public IActionResult Shutdown()
{
    return View();
}

단일 요구사항에 다수의 허용되는 역할을 지정하고 싶다면, 해당 역할들을 RequireRole 메서드에 매개변수로 전달하면 됩니다:

options.AddPolicy("ElevatedRights", policy =>
                  policy.RequireRole("Administrator", "PowerUser", "BackupAdministrator"));

이 예제 코드는 Administrator 역할, PowerUser 역할, BackupAdministrator 역할을 부여받은 사용자에게 권한을 부여합니다.