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: 로그인한 사용자
✅ 권한 설정 예시
Roles 클릭
Authenticated 선택
특정 컨텐츠 타입(예: Review)에 대해 Create, Read, Update, Delete 권한 설정 가능
저장 (Save)
✅ 새 역할 만들기 (예: 관리자/에디터 등)
Roles 메뉴에서 Create new role
이름 입력 (예: admin, editor)
원하는 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 등 자유롭게 설정 가능
댓글 ( 0)
댓글 남기기