0Pricing
Node.js Backend Development Bootcamp · 강의

역할 기반 접근 제어

권한 부여를 위한 미들웨어를 개발하고 사용자 역할과 권한에 따라 API 경로 접근을 제한합니다.

역할 기반 접근 제어은(는) CoddyKit의 무료 Node.js Backend Development Bootcamp 강의입니다. 이것은 6개 중 5번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Node.js Backend Development Bootcamp 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Node.js Backend Development Bootcamp 강의에는 총 6개의 강의가 포함되어 있습니다.

이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.

Intro to Role-Based Access Control

Welcome! In this lesson, we'll dive into Role-Based Access Control (RBAC). RBAC is a method of restricting system access based on the roles individual users have within an organization.

Think of it like a set of keys: each key (role) grants access to specific doors (resources or actions). Instead of giving each person a key to every door, you give them a keyring based on their job.

Importance of RBAC

RBAC is crucial for building secure and scalable applications. It offers several benefits:

  • Improved Security: Users only access what they need.
  • Simplified Management: Easier to manage permissions for groups rather than individuals.
  • Reduced Errors: Less chance of granting incorrect access.
  • Enhanced Compliance: Helps meet regulatory requirements for data access.

Without RBAC, managing permissions in a growing application becomes a nightmare!

Roles & Permissions Defined

It's important to understand the difference between roles and permissions:

  • Role: A collection of permissions. Examples: Admin, Editor, Viewer, Guest.
  • Permission: A specific action a user can perform. Examples: read:post, write:post, delete:user.

A user is assigned one or more roles, and each role has a set of defined permissions. This structure makes access control flexible.

How to Store User Roles

When a user registers or logs in, their assigned roles need to be stored. Common ways to do this include:

  • Database Field: A string (e.g., "admin", "user") or an array of strings (e.g., ["admin", "editor"]) in the user's document/record.
  • JWT Payload: Include the roles directly in the JSON Web Token (JWT) during login. This makes them easily accessible on each request.

For our examples, we'll assume roles are available on the req.user object, which would be populated by a preceding authentication middleware (like one from a previous lesson).

Authorization Middleware Flow

In Express.js, middleware functions are perfect for authorization. An authorization middleware sits between the request and the route handler.

Here's how it works:

  1. A request comes in for a protected route.
  2. Our authorization middleware runs.
  3. It checks if the authenticated user has the necessary role(s).
  4. If yes, it calls next() to pass control to the route handler.
  5. If no, it sends an error response (e.g., 403 Forbidden).

Define Role Check Middleware

We'll create a reusable middleware function that checks if an authenticated user has a specific role. This function accepts the requiredRole as an argument and returns another middleware function.

A real application would first have an authentication middleware populating req.user.

function authorizeRoles(requiredRole) {
  return (req, res, next) => {
    // Assume req.user is populated by auth middleware
    // e.g., req.user = { id: 'abc', roles: ['user', 'editor'] }
    if (!req.user || !req.user.roles || !req.user.roles.includes(requiredRole)) {
      console.log(`Access Denied: Missing role '${requiredRole}'`);
      return res.status(403).send('Forbidden: Insufficient role');
    }
    console.log(`Access Granted for role '${requiredRole}'`);
    next(); // User has the required role, proceed
  };
}

// To make it runnable for demonstration, let's wrap it in a mock Express-like setup
const mockReq = { user: { id: '123', roles: ['user', 'admin'] } };
const mockRes = {
  status: function(code) { this.statusCode = code; return this; },
  send: function(msg) { console.log(`Response Status: ${this.statusCode}, Message: ${msg}`); }
};
const mockNext = () => console.log('Next middleware/route handler called.');

console.log('--- Testing authorizeRoles("admin") ---');
const adminAuth = authorizeRoles('admin');
adminAuth(mockReq, mockRes, mockNext);

console.log('\n--- Testing authorizeRoles("guest") ---');
const guestAuth = authorizeRoles('guest');
guestAuth(mockReq, mockRes, mockNext);

Protecting Routes with RBAC

Now, let's see how to apply our authorizeRoles middleware to protect specific routes in an Express.js application.

We can pass the middleware function directly to a route definition. Any request to that route will first pass through the authorization check.

const express = require('express');
const app = express();

// Mock authentication middleware (from previous lessons)
app.use((req, res, next) => {
  // In a real app, this would verify a JWT and populate req.user
  req.user = { id: 'user123', roles: ['user', 'viewer'] };
  next();
});

// Our authorization middleware
function authorizeRoles(requiredRole) {
  return (req, res, next) => {
    if (!req.user || !req.user.roles.includes(requiredRole)) {
      return res.status(403).send('Forbidden: Insufficient role');
    }
    next();
  };
}

// Route accessible only by 'admin'
app.get('/admin-panel', authorizeRoles('admin'), (req, res) => {
  res.send('Welcome to the Admin Panel!');
});

// Route accessible by 'user' or 'viewer' (since req.user has 'user', 'viewer')
app.get('/my-profile', authorizeRoles('user'), (req, res) => {
  res.send(`Hello ${req.user.id}, this is your profile.`);
});

app.listen(3000, () => {
  console.log('Server running on port 3000. Try accessing /admin-panel or /my-profile');
});

Handling Multiple Required Roles

Sometimes a route might be accessible by more than one role (e.g., an Editor or an Admin). We can extend our middleware to accept multiple required roles.

The user just needs to have *at least one* of the specified roles to gain access.

const express = require('express');
const app = express();

// Mock authentication middleware
app.use((req, res, next) => {
  req.user = { id: 'editor456', roles: ['user', 'editor'] };
  next();
});

// Middleware to check for multiple roles
function authorizeAnyRole(requiredRoles) {
  return (req, res, next) => {
    if (!req.user || !req.user.roles) {
      return res.status(403).send('Forbidden: User roles not found');
    }
    const hasRequiredRole = req.user.roles.some(role =>
      requiredRoles.includes(role)
    );
    if (!hasRequiredRole) {
      return res.status(403).send('Forbidden: Insufficient role(s)');
    }
    next();
  };
}

// Route accessible by 'admin' OR 'editor'
app.get('/edit-content', authorizeAnyRole(['admin', 'editor']), (req, res) => {
  res.send('You can edit content!');
});

// Route accessible by 'admin' only
app.get('/delete-all', authorizeAnyRole(['admin']), (req, res) => {
  res.send('Danger Zone: All data deleted!');
});

app.listen(3000, () => {
  console.log('Server running on port 3000. Try /edit-content or /delete-all');
});

Beyond Roles: Granular Permissions

While roles are great for grouping permissions, sometimes you need more granular control. This is where explicit permissions come in.

  • Instead of authorizeRoles('admin'), you might have authorizePermission('delete:user').
  • Your user object would then store an array of specific permissions (e.g., ['read:post', 'update:post', 'delete:comment']).

This approach offers maximum flexibility but can increase complexity in managing permissions.

Check Your Understanding

Consider the following Express route setup:

// ... (assume authorizeRoles function is defined as in lesson)
app.use((req, res, next) => {
  req.user = { id: 'testUser', roles: ['user', 'moderator'] };
  next();
});

app.get('/moderate', authorizeRoles('moderator'), (req, res) => {
  res.send('Moderator access granted.');
});

app.get('/admin-only', authorizeRoles('admin'), (req, res) => {
  res.send('Admin access granted.');
});

Recap & Next Steps

Great job! You've learned how to implement Role-Based Access Control in your Node.js applications using Express.js middleware.

  • RBAC restricts access based on user roles.
  • Middleware functions are ideal for checking roles before route access.
  • You can check for single roles or multiple roles.
  • Advanced scenarios might involve direct permission checks.

Proper authorization is key to securing your API. Keep practicing to master these concepts!

자주 묻는 질문

“역할 기반 접근 제어” 강의는 무료인가요?

네 — “역할 기반 접근 제어” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Node.js Backend Development Bootcamp 강의 전체를 잠금 해제할 수 있습니다. Node.js Backend Development Bootcamp 강의에는 총 6개의 강의가 포함되어 있습니다.

“역할 기반 접근 제어”에서 뭘 배우나요?

권한 부여를 위한 미들웨어를 개발하고 사용자 역할과 권한에 따라 API 경로 접근을 제한합니다. 브라우저에서 직접 실행하는 실습 코드로 Node.js Backend Development Bootcamp을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Node.js Backend Development Bootcamp을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Node.js Backend Development Bootcamp은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 6개 중 5번째 강의입니다.

“역할 기반 접근 제어” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Node.js Backend Development Bootcamp 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Node.js Backend Development Bootcamp 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 사용자 등록과 로그인
  2. JWT 토큰 생성 및 검증
  3. 상태 비저장 인증을 위한 JWT
  4. OAuth2 비밀번호 흐름 연동
  5. 역할 기반 접근 제어
  6. 역할 기반 접근 제어(RBAC)
← Node.js Backend Development Bootcamp(으)로 돌아가기