다음을 통해 공유


Node.js 웹 애플리케이션에서 역할 기반 액세스 제어 사용

적용 대상: 회색 X 기호가 있는 흰색 원입니다. Workforce 테넌트 흰색 검사 기호 기호가 있는 녹색 원입니다. 외부 테넌트(자세한 정보)

RBAC(역할 기반 액세스 제어)는 애플리케이션에서 권한 부여를 적용하는 메커니즘입니다. Microsoft Entra 외부 ID 통해 애플리케이션에 대한 애플리케이션 역할을 정의하고 해당 역할을 사용자 및 그룹에 할당할 수 있습니다. 사용자 또는 그룹에 할당하는 역할은 애플리케이션의 리소스 및 작업에 대한 액세스 수준을 정의합니다. 외부 ID가 인증된 사용자에 대한 보안 토큰을 발급하는 경우 보안 토큰의 역할 클레임에 사용자 또는 그룹을 할당한 역할의 이름이 포함됩니다.

사용자의 그룹 멤버 자격을 반환하도록 외부 테넌트도 구성할 수 있습니다. 그러면 개발자는 보안 그룹을 사용하여 애플리케이션에서 RBAC를 구현할 수 있습니다. 여기서 특정 그룹의 사용자 멤버 자격은 해당 역할 멤버 자격으로 해석됩니다.

역할에 사용자 및 그룹을 할당하면 역할 클레임이 보안 토큰에 내보내집니다. 그러나 보안 토큰에서 그룹 멤버 자격 클레임을 내보내려면 고객의 테넌트에서 추가 구성이 필요합니다.

이 문서에서는 사용자 역할 또는 그룹 멤버 자격 또는 둘 다를 Node.js 웹앱에 대한 보안 토큰의 클레임으로 수신하는 방법을 알아봅니다.

필수 조건

Node.js 웹앱에서 그룹 및 역할 클레임 받기

고객의 테넌트가 구성되면 클라이언트 앱에서 역할그룹 클레임을 검색할 수 있습니다. 역할그룹 클레임은 모두 ID 토큰과 액세스 토큰에 있지만, 클라이언트 앱은 클라이언트 쪽에서 권한 부여를 구현하기 위해 ID 토큰에서 이러한 클레임에 대해서만 검사합니다. API 앱은 액세스 토큰을 받을 때 이러한 클레임을 검색할 수도 있습니다.

다음 코드 조각 예제와 같이 역할 클레임 값을 검사:

const msal = require('@azure/msal-node');
const { msalConfig, TENANT_SUBDOMAIN, REDIRECT_URI, POST_LOGOUT_REDIRECT_URI } = require('../authConfig');

...
class AuthProvider {
...
    async handleRedirect(req, res, next) {
        const authCodeRequest = {
            ...req.session.authCodeRequest,
            code: req.body.code, // authZ code
            codeVerifier: req.session.pkceCodes.verifier, // PKCE Code Verifier
        };
    
        try {
            const msalInstance = this.getMsalInstance(this.config.msalConfig);
            const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
            let roles = tokenResponse.idTokenClaims.roles;
        
            //Check roles
            if (roles && roles.includes("Orders.Manager")) {
                //This user can view the ID token claims page.
                res.redirect('/id');
            }
            
            //User can only view the index page.
            res.redirect('/');
        } catch (error) {
            next(error);
        }
    }
...
}

여러 역할에 한 사용자를 할당하는 경우 roles 문자열에는 Orders.Manager,Store.Manager,...와 같이 쉼표로 구분된 모든 역할이 포함됩니다. 다음 조건을 처리하도록 애플리케이션을 빌드해야 합니다.

  • 토큰에 roles 클레임이 없음
  • 사용자가 역할에 할당되지 않았습니다.
  • 여러 역할에 한 사용자를 할당할 때 roles 클레임의 여러 값

또한 다음 코드 조각 예제와 같이 그룹 클레임 값을 검사:

const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);
let groups = tokenResponse.idTokenClaims.groups;

그룹 클레임 값은 그룹의 objectId입니다. 사용자가 여러 그룹의 멤버인 경우 groups 문자열에는 7f0621bc-b758-44fa-a2c6-...,6b35e65d-f3c8-4c6e-9538-...과 같이 쉼표로 구분된 모든 그룹이 포함됩니다.

참고 항목

Microsoft Entra 기본 제공 역할 또는 일반적으로 디렉터리 역할이라는 역할에 사용자를 할당하는 경우 해당 역할은 보안 토큰의 그룹 클레임에 표시됩니다.

그룹 초과분 처리

보안 토큰의 크기가 HTTP 헤더 크기 제한을 초과하지 않도록 외부 ID는 그룹 클레임에 포함된 개체 ID의 수를 제한합니다. 초과분 제한은 SAML 토큰의 경우 150개, JWT 토큰의 경우 200개입니다. 한 사용자가 여러 그룹에 속하고 모든 그룹에 대해 요청하는 경우 이 제한을 초과할 수 있습니다.

소스 코드에서 그룹 초과분 검색

그룹 초과를 방지할 수 없는 경우 코드에서 처리해야 합니다. 초과분 제한을 초과하면 토큰에 그룹 클레임이 포함되지 않습니다. 대신 토큰에는 배열의 그룹 멤버가 포함된 _claim_names 클레임이 포함됩니다. 따라서 초과분이 발생했음을 알리기 위해 _claim_names 클레임의 존재를 확인합니다. 다음 코드 조각에서는 그룹 초과를 검색하는 방법을 보여 줍니다.

const tokenResponse = await msalInstance.acquireTokenByCode(authCodeRequest, req.body);

if(tokenResponse.idTokenClaims.hasOwnProperty('_claim_names') && tokenResponse.idTokenClaims['_claim_names'].hasOwnProperty('groups')) {
    //overage has occurred
}

토큰에서 그룹 클레임 및 앱 역할 구성 문서의 지침을 사용하여 그룹 초과가 발생할 때 전체 그룹 목록을 요청하는 방법을 알아봅니다.

Node.js 웹앱에서 그룹 및 역할 값을 사용하는 방법

클라이언트 앱에서 로그인한 사용자에게 보호된 경로에 액세스하거나 API 엔드포인트를 호출하는 데 필요한 역할이 있는지 확인할 수 있습니다. ID 토큰에서 roles 클레임을 확인하여 이 작업을 수행할 수 있습니다. 앱에서 이 보호를 구현하려면 사용자 지정 미들웨어를 사용하여 가드를 빌드할 수 있습니다.

서비스 앱(API 앱)에서 API 엔드포인트를 보호할 수도 있습니다. 클라이언트 앱에서 보낸 액세스 토큰의 유효성을 검사한 후 액세스 토큰의 페이로드 클레임에서 역할 또는 그룹 클레임에 대해 확인할 수 있습니다.

앱 역할 또는 그룹을 사용하나요?

이 문서에서는 앱 역할 또는 그룹을 사용하여 애플리케이션에서 RBAC를 구현할 수 있다는 것을 배웠습니다. 애플리케이션 수준에서 액세스/권한을 관리할 때 보다 세부적인 제어를 제공하기 때문에 앱 역할을 사용하는 것이 좋습니다. 접근 방식을 선택하는 방법에 대한 자세한 내용은 접근 방식 선택을 참조하세요.

다음 단계