Strapi 1년이면 풀스택을 읊는다 Part (2/2)

Harim kim
더핑크퐁컴퍼니 기술 블로그
6 min readAug 13, 2021

--

해당 게시물은 Strapi v3기준으로 작성되었습니다.

그 외 Strapi 관련 이야기

Strapi 컨트리뷰터가 된 계기와 PR 후기

답답하면 니들이 뛰든가

라는 말이 있죠. 그래서 직접 뛰어보았습니다 🏃

첫 PR은 한글 패치였습니다. 이미 어드민 패널에 한글화가 진행되어있었지만, 일부분 번역이 매끄럽지 않거나 번역이 안 된 부분이 있어서 수정해보고 싶다는 생각이 들었습니다. 사실 저는 오픈 소스에 이슈를 남겨 본 적은 있어도 풀리퀘스트를 직접 해본 적은 없었습니다. 굉장히 두근거리는 마음으로 CONTRIBUTING.md를 차근차근 읽으면서 PR을 준비했습니다. 사실 파일 하나를 수정하는 일이라서 큰 부담은 없었지만 첫 커밋이라 떨리더군요. 풀리퀘를 날린지 얼마 안 되어 Strapi 측에서 PR 고마워! 라고 하면서 마스터에 머지를 했을 때는 매우 뿌듯했습니다. 😃

두 번째 PR은 몽고DB의 트랜잭션을 Strapi ORM에서 쓸 수 있도록 만들어주는 내용이었습니다. SQL DB는 이미 지원하고 있었지만 몽고DB는 사용자가 적어서 그런지 아직 지원하지 않더군요. 몽고 DB 문서를 찾아보았더니 MongoDB 4.0 버전부터 multi document transaction을 지원하고 있었고, mongoose에서도 session 파라메터를 통해서 트랜잭션 처리가 가능했습니다. 다만 Strapi의 ORM에선 이 session 파라메터를 받는 부분이 없었기 때문에 이 부분만 추가해주면 되겠는데? 라고 생각했고 실제로 테스트를 해보니 생각한 대로 트랜잭션이 잘 되더군요. 꼼꼼히 코드를 수정, 확인하고 PR을 날렸지만 역시 코어한 내용이라 그런지 리뷰가 엄청 느렸습니다. 중간중간에 master 브랜치의 수정사항 때문에 conflict를 해결하거나 CI 테스트에 실패해서 이를 수정하는 과정도 빈번했습니다. 결과적으로 무려 1년에 걸쳐서 제 PR이 마스터에 머지가 되었습니다 🎉🎉 덕분에 제 프로젝트에서 커스텀으로 쓰던 MongoDB 커넥터를 Strapi 공식 커넥터로 다시 대체할 수 있어서 기분이 매우 좋았습니다 😁

이 외에도 현재 진행형이거나, 테스트를 통과하지 못해서 실패한 PR 등이 있는데 모두 저에게 좋은 경험이 되고 있습니다! 크리티컬한 버그 같은 경우는 PR 반영이 매우 빨라서 좋더군요. Strapi가 40k의 스타를 가지고 있는 것도 사용자들이 이런 활발한 생태계를 느끼고 있기 때문이 아닌가 싶습니다.

외부 서비스에서 사용할 Strapi 액세스 토큰 만들기

저희 팀은 내부적으로 통신하는 프로젝트가 많다 보니 외부 서비스에서 사용할 인증 수단이 필요했습니다. Strapi는 JWT 기반의 액세스 토큰으로 인증된 사용자인지를 검증하고 있는데, 로드맵에는 있으나 아직 공식으로 액세스 토큰 생성을 지원하지는 않습니다. 그래서 사용자가 직접 액세스 토큰을 만들어서 사용해야 합니다. 액세스 토큰을 만드는 방법은 두 가지가 있는데 첫 번째는 User 기반의 액세스 토큰을 만드는 방법이고, 두 번째는 Admin 사용자 기반의 액세스 토큰을 만드는 방법입니다.

User 기반의 액세스 토큰은 Admin 토큰에 비해 보안 상 좀 더 안전합니다. 엔드 포인트의 권한을 세세하게 줄 수 있기 때문이죠. Admin 토큰은 기본 권한이 Super Admin이기 때문에 편리하지만 보안성은 떨어집니다. 어드민 역할 관리 페이지에서 제한된 권한을 줄 수는 있지만 무료 플랜은 3개까지만 역할을 만들 수 있고 역할이 갖는 권한의 범위를 User 토큰에 비해서 세세하게 줄수 없다는 단점이 있습니다.

User 기반의 액세스 토큰을 만드는 방법은 Strapi 공식 문서의 API tokens를 참조해주세요.

Admin 기반의 액세스 토큰을 만드는 방법은 간단합니다. Strapi 어드민 패널에서 Settings > ADMINISTRATION PANEL > Users 메뉴로 들어가 어드민 유저를 생성해주세요. 생성된 유저 페이지를 들어가면 URL의 마지막에 admin 유저의 id가 있습니다. 그 상태에서 터미널을 열고 strapi가 설치된 루트 경로에서 NODE=1338 yarn strapi console을 실행해주세요. 그리고 다음 스크립트에서 아까 전에 알아낸 adminId를 `XXX` 부분에 넣고 실행하시면 토큰이 발급됩니다.

async function issueAdminToken(adminId) {
let adminUser;
try {
adminUser = await strapi.query("user", "admin").findOne({ id: adminId });
} catch (e) {
console.log(e);
throw e;
}
if (!adminUser) {
strapi.log.error("해당 어드민 계정은 DB에 존재하지 않습니다.");
throw new Error("해당 어드민 계정은 DB에 존재하지 않습니다.");
}
return strapi.admin.services.token.createJwtToken(adminUser);
}
issueAdminToken(XXX);

발급 받은 토큰은 외부 서비스에서 Authorization 헤더에 Bearer xxxx…을 넣어서 사용할 수 있습니다.

만약 발행된 토큰의 유효 기간을 수정하고 싶으면 ./config/server.js에서 admin.options.expiresIn을 원하는 기간으로 수정해주세요. (10y는 10년, 1m는 1달, 1h는 1시간) 아래는 예시입니다.

module.exports = ({ env }) => ({
...,
admin: {
url: "/admin",
autoOpen: false,
watchIgnoreFiles: [],
auth: {
secret: env("ADMIN_JWT_SECRET"),
options: { expiresIn: "10y" },
},
},
});

마치며

지금까지 Strapi에 대한 소개와 장단점, 소소한 꿀팁 등을 공유해보았습니다. Strapi는 2015년에 생긴 프로젝트로 현재까지 활발한 오픈 소스 생태계와 높은 확장성으로 많은 개발자들에게 사랑을 받고 있는 CMS입니다. 실제 서비스에 Strapi를 1년 반 정도 쓰면서 느낀 점은 정말 확장성이 높고 개발 속도가 빨라서 다양한 요구사항에 빠르게 대처할 수 있다는 점이었습니다. 복잡한 쿼리와 쿼리 튜닝이 어렵다는 점이 아쉽지만, Strapi 팀에서도 인지하고 있는 만큼 앞으로 점점 더 개선될 것으로 보입니다. 긴 글 읽어주셔서 감사합니다 :)

--

--