정적 위키 초코스프레드: 안전한 버전
- 개발 시작: 2024.09.06. – 2024.09.09.
- 개발 기간: 4일
정적 위키?
Github의 정적 페이지 호스팅 서비스(pages)를 사용하여 배포하는 위키입니다. 데이터베이스로는 구글 스프레드시트를 사용해요.
그러니까 사실은 구글 스프레드시트 파서 에 가깝다고 해도, 할 말이 없습니다.
이전 프로젝트의 취약점
이전 프로젝트는 클라이언트 사이드에서 바닐라JS만 사용하여, API키가 그대로 노출되는 문제점이 있었습니다.
또 사소한 문제였지만 라우팅 기능이 없었기 때문에 경로가 아닌 쿼리스트링 상에서 모든 것을 처리했던 문제도 있었습니다. 그래서 각 문서들의 주소가 복잡했어요.
Nuxt.js와 Github Actions
이번 버전의 초코스프레드 위키는 Nuxt로 작성되었습니다.
Nuxt는 Vue 기반의 프레임워크로, 일단 node를 사용하지만, Github pages로 배포할 경우에는 Actions에 의해 정적 페이지로 렌더된 사이트가 배포됩니다.
이 방식은 서버를 사용하지는 않지만, secret에 입력한 프라이빗 키를 가지고 Action에서 자동으로 렌더 되기 때문에 훨씬 안전하고, 페이지 로딩도 빠릅니다.
또 정적 페이지긴 하지만 나름대로의 동적 라우팅도 구현할 수 있습니다.
개선점 1. 인증키
스프레드시트의 보기/편집 권한을 얻기 위해서 두 가지 인증 방식을 사용합니다.
- 위키를 보여주는 서비스 계정의 인증
- 위키 편집을 위한 사용자 계정의 인증
(1) 은 Google Action을 통해 서버사이드에서 처리한 것을 정적 렌더링하기 때문에 인증키가 보이지 않고, (2) 의 경우 구글 공식문서에서 제시하고 있는 클라이언트 사이드 인증을 사용하기 때문에 인증키가 필요없어요.
스프레드시트의 권한 설정을 제한된 편집자들에게만 공개하고, 외부 공유 링크는 막아둘 수 있다는 점도 개선된 점 중 하나입니다.
개선점 2. 라우팅
예전 버전의 초코스프레드 위키에서 대문
문서로 접속하기 위한 주소는 다음과 같았습니다.
https://wiki.rongo.moe/?d=대문
하지만 지금은 기존의 다른 위키 서비스들과 동일하게,
https://wiki.rongo.moe/대문/
으로 접속할 수 있습니다.
그래서 문서 제목은 /
를 포함할 수 없습니다. 샘플 위키의 경우 .
으로 /
의 역할을 대신하고 있습니다.
아쉬운 점
물론 서버를 사용하지 않기 때문에, 실제 위키의 동작을 완전히 따라하지 못하는 면이 있습니다.
대표적인 것이 편집 내용이 실시간으로 반영되지 않는다는 것입니다. 현재 리포지토리에서 설정된 자동 배포는 5분마다이며, 실제로는 5분에서 10분 정도의 간격으로 배포됩니다. 스프레드시트에서 편집된 내용이 위키에 반영되기까지는 최대 10분 정도가 소요됩니다.
편집자들이 스프레드시트, 즉 데이터베이스에 직접 접속할 수 있다는 점도 한계라고 할 수 있습니다. 스프레드시트에 직접 접속해 시트를 삭제하거나, 내용을 전부 없던 일로 만들어버리거나 버전을 왜곡할 수 있습니다. 하지만 이런 것은 스프레드시트 자체의 버전 관리 기능을 통해 어느 정도 극복할 수 있습니다.
그럼에도 불구하고 무료로 위키를 제작할 수 있기 때문에, 한정된 주제를 가진 최대 3-4인 정도 되는 소규모 그룹에서 운영된다면 나름 좋은 솔루션이 될 수 있다고 생각합니다.