LMS (Learn)
사내 온라인 강의 시스템
개요
- 사내 직원용 온라인 강의 플랫폼으로, 관리자가 Cloudflare Stream에 업로드한 영상을 강의로 등록하면 사원은 Google 계정으로 로그인해 분류와 주제별 강의를 시청
- 시청 진도는 서버에서 검증 및 누적되며, 댓글과 자료 다운로드를 강의 상세 화면에서 함께 처리
주요 기능
- Google SSO 로그인 Google OAuth 2.0 기반 사내 계정 검증 후 HMAC-SHA256 서명 쿠키 세션 발급, 사내 SSO(work.egnis.net)와 동일 토큰 체계 공유
- Cloudflare Stream 재생 RS256 서명 JWT를 1시간 단위로 발급하여 비공개 영상 보호, hls.js 기반 HLS 스트리밍 재생
- 시청 트래킹 재생 시작 시 세션 토큰 발급, 10초 단위 하트비트로 누적 시청 시간 및 최대 시청 위치 갱신, 동일 계정 동시 재생 제한
- 세션 기반 진도 검증 currentPosition을 서버에서 검증하여 조작 차단, 완료 여부 및 완료 시점 서버 단독 판정 및 기록
- 분류 및 주제 관리 관리자 기반 분류, 주제, 난이도, 필수 여부 관리 및 강의 카드 노출
- 댓글 강의별 스레드 형태 댓글, 권한 기반 작성 및 수정, 삭제 지원
- 첨부 자료 R2 기반 자료 다운로드, 서명 토큰 기반 접근 제어
- 어드민 강의 등록 및 수정, Stream direct upload URL 발급, 분류 및 주제 관리, 사용자 권한 제어
기술 스택
- TypeScript 기반 Cloudflare Worker가 강의 페이지, API, 트래킹, 어드민 기능을 단일 코드베이스로 서빙
- 영상은 Cloudflare Stream을 사용하며 RS256 서명 JWT를 Web Crypto API로 직접 발급해 비공개 재생을 보호
- 데이터는 D1, 첨부 파일은 R2에 저장
- 프론트엔드는 서버 렌더 HTML 위에 Tailwind CSS와 Vanilla JS로 구성되며, 영상 재생은 hls.js 기반으로 처리
설계 노트
- Stream signing key를 직접 JWK로 관리하여 외부 SDK 없이 JWT 서명 처리
- 단일 활성 시청 세션 구조로 다중 탭 시청 및 시간 누적 조작 방지
- 하트비트 기반 서버 누적 방식으로 클라이언트 진도 신뢰 제거
- direct upload 방식으로 대용량 영상은 워커를 우회하여 Stream에 직접 업로드
- 사내 SSO 토큰 구조를 공유하여 서비스 간 자연스러운 인증 연동 유지