Nodejs

 

Strapi에서 회원가입 및 로그인 구현 + 사용자 역할(Role) 설정 방법

1. 기본 개념 이해

Strapi는 기본적으로 사용자 인증(Authentication)과 권한(Role-based Access Control)을 제공합니다. 사용자는 Public, Authenticated 역할 외에도 커스텀 역할을 만들어 다양한 권한을 줄 수 있습니다.

2. Strapi 회원가입 및 로그인 기본 API

Strapi의 기본 인증 플러그인인 Users & Permissions Plugin은 다음 REST API를 제공합니다:

✅ 회원가입 API

POST /api/auth/local/register

 

 

Body 예시:

{
  "username": "john",
  "email": "john@example.com",
  "password": "123456"
}

✅ 로그인 API

POST /api/auth/local

Body 예시:

{
  "identifier": "john@example.com",
  "password": "123456"
}

???? 로그인 성공시 응답 예시

{
  "jwt": "...토큰...",
  "user": {
    "id": 1,
    "username": "john",
    "email": "john@example.com",
    "confirmed": true,
    "blocked": false
  }
}

이 JWT를 사용해서 보호된 API를 호출할 수 있습니다.

 

 

3. 역할(Role) 및 권한(Permission) 설정

Strapi 관리자 패널에서 Users & Permissions Plugin > Roles 메뉴에서 역할별로 접근 권한을 설정할 수 있습니다.

✅ 기본 역할

  • Public: 로그인 안 한 사용자

  • Authenticated: 로그인한 사용자

✅ 권한 설정 예시

  1. Roles 클릭

  2. Authenticated 선택

  3. 특정 컨텐츠 타입(예: Review)에 대해 Create, Read, Update, Delete 권한 설정 가능

  4. 저장 (Save)

✅ 새 역할 만들기 (예: 관리자/에디터 등)

  1. Roles 메뉴에서 Create new role

  2. 이름 입력 (예: admin, editor)

  3. 원하는 API 권한 부여 후 저장

 

 

4. 회원가입 시 역할 자동 할당

Strapi는 기본적으로 사용자 등록 시 Authenticated 역할을 자동으로 부여합니다. 커스텀 역할을 자동 할당하려면 다음 방법 중 하나를 사용합니다:

방법 1: 사용자 등록 후 서버에서 역할 변경

Strapi Admin 또는 서버 사이드에서 사용자 생성 후 PUT /api/users/:id로 역할 ID를 변경

방법 2: 커스텀 회원가입 API 작성

Strapi의 src/extensions/users-permissions/controllers/auth.js를 커스터마이징하여 회원가입 시 자동으로 특정 역할을 부여하도록 설정

 

 

5. 이메일 인증 / 비활성화

기본적으로 이메일 인증이 활성화되어 있습니다. 비활성화 하려면:

  • 관리자 패널 > Users & Permissions > Advanced Settings

  • "Enable email confirmation" 옵션 해제

 

 

6. 로그인 후 유저 정보 가져오기

✅ 현재 로그인한 유저 확인 API

GET /api/users/me

헤더에 JWT 토큰 포함:

Authorization: Bearer <jwt>

 

 

7. Next.js에서 연동 시 팁

  • 로그인 성공 시 JWT를 localStorage 또는 HttpOnly Cookie에 저장

  • API 호출 시 Authorization: Bearer 토큰 헤더 포함

  • 사용자 인증 상태는 Context 또는 Zustand 같은 상태관리로 관리하면 편리함

✅ 마무리 체크리스트

  • 회원가입 폼 구현

  • 로그인 폼 구현

  • JWT 토큰 저장/사용

  • 사용자 권한 별 API 접근 설정

  • 필요시 이메일 인증 비활성화

  • 역할에 따라 접근 제어 (ex: 관리자 페이지 등)

 

 

 

 

✅ 1. Access Token 만료 시간 설정

⭕설정 파일 위치:

/config/plugins.js 또는 /config/plugins.ts

module.exports = ({ env }) => ({
  // ...
  'users-permissions': {
    config: {
      jwt: {
        secret: env('JWT_SECRET'),
        expiresIn: '1h', // ⏰ 여기가 토큰 만료 시간 설정!
      },
    },
  },
});

 

  • expiresIn은 jsonwebtoken 라이브러리 기준

    • 예: '1h', '30m', '7d', '10s' 등 가능

  • 기본값은 '30d'로 설정되어 있음 (Strapi 기본값)

 

 

 

 

 

✅ 2. 리프레시 토큰(갱신 토큰) 설정 방법

 

Strapi는 기본적으로 리프레시 토큰을 제공하지 않습니다. 하지만 구현 가능하며, 보통 다음과 같이 커스터마이징합니다:

 

⭕커스터마이징 위치:

/src/extensions/users-permissions/strapi-server.js 파일을 생성 후, 로그인(auth/local) 로직 오버라이드

 

const jwt = require('jsonwebtoken');

module.exports = (plugin) => {
  const { sanitize } = require('@strapi/utils');
  const { getService } = require('@strapi/plugin-users-permissions/server/utils');

  plugin.controllers.auth.callback = async (ctx) => {
    const { identifier, password } = ctx.request.body;

    const user = await strapi
      .plugin('users-permissions')
      .service('user')
      .fetch({ email: identifier });

    if (!user) {
      return ctx.badRequest('Invalid identifier or password');
    }

    const validPassword = await strapi
      .plugin('users-permissions')
      .service('user')
      .validatePassword(password, user.password);

    if (!validPassword) {
      return ctx.badRequest('Invalid identifier or password');
    }

    const payload = {
      id: user.id,
    };

    const accessToken = jwt.sign(payload, process.env.JWT_SECRET, {
      expiresIn: '15m',
    });

    const refreshToken = jwt.sign(payload, process.env.JWT_SECRET, {
      expiresIn: '7d',
    });

    ctx.send({
      jwt: accessToken,
      refreshToken, // ✅ 여기에 리프레시 토큰 포함
      user: await sanitize.contentAPI.output(user),
    });
  };

  return plugin;
};

 

 

 

✅ 3. 보안적으로 고려할 점

  • 리프레시 토큰은 HTTP-only 쿠키에 저장하거나, DB에 저장 후 블랙리스트 관리 방식으로 운용하는 것이 안전합니다.

  • 토큰 재발급 라우트(/auth/refresh-token)를 커스터마이징해서 따로 만들어야 합니다.

 

 

 

⭕변수 이름 정리

 

 

 

 

 

 

 

 

✨ 마무리 요약

  • Access Token 만료 시간은 users-permissions plugin 설정에서 expiresIn으로 조절

  • Refresh Token은 기본 제공되지 않으므로 strapi-server.js에서 로그인 로직 오버라이드 필요

  • 변수 이름은 jwt, refreshToken 등 자유롭게 설정 가능

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

새벽달 보려고 어스름달 안 보랴 , 아직 닥치지 않은 미래의 일만 생각하여, 지금 당장의 일을 무시할 수는 없다는 뜻.

댓글 ( 0)

댓글 남기기

작성