지원 언어
모두 사용자 브라우저에서만 실행합니다. 코드가 우리 서버로 가지 않습니다.
| 언어 | 어디서 | 방식 | 채점 문제 |
|---|---|---|---|
| JavaScript | 연습장 · 문제 | Dedicated Worker + 타임아웃 | 있음 |
| TypeScript | 연습장 · 문제 | Sucrase → JS → Worker | 있음 |
| Python | 연습장 · 문제 | Pyodide (CPython Wasm) | 있음 |
| SQL | 연습장 · 문제 | sql.js (SQLite Wasm) | 있음 |
| Lua | 연습장 · 문제 | wasmoon (Lua 5.4 Wasm) | 있음 |
| C / C++ | C 실험장 | Wasmer Clang · 멀티파일 · COEP | 없음 (실험) |
| HTML / CSS / JS | 결과물 | 멀티파일 합치기 + sandbox iframe | 미리보기만 |
비지원 언어
브라우저만으로 돌리려면 툴체인이 너무 크거나 JVM·Dart 호스트가 필요합니다. Judge0 · Piston 같은 원격 실행 API는 쓰지 않습니다 (코드·입력이 외부로 나감).
| 언어 / 스택 | 이유 (요약) |
|---|---|
| Rust | 풀 rustc Wasm이 수백 MB급 · 현실적이지 않음 |
| C# | .NET 런타임/컴파일러를 브라우저에 올리기 부담 |
| Java | JDK / JVM 필요 |
| Kotlin | 컴파일러 + JVM 계열 |
| Flutter / Dart | Dart SDK · 앱 런타임이 브라우저 연습장 범위 밖 |
안전 설계 원칙
- 실행 경계 — Cloudflare Pages는 정적 파일만 줍니다. 서버에 컴파일러·채점 워커가 없습니다.
- 신뢰 경계 — 코드는 제출한 사람의 브라우저에서만 돕니다. 다른 방문자나 우리 서버를 공격하는 경로를 설계에서 제거합니다.
- 원격 Judge 금지 — “언어를 더 돌리기 위해” Judge0 · Piston 등으로 코드를 보내지 않습니다.
- 과장하지 않음 — 100% 안전이라고 하지 않습니다. 목표는 서버 RCE·공유 채점 DoS를 없애는 것입니다. 자기 탭은 멈출 수 있습니다.
실행 방식
정적 HTML/JS만 배포하고, 인터프리터·컴파일러 역할은 WebAssembly / Worker를 사용자 기기로 내려보내 수행합니다.
쓰지 않는 것
- 서버/Pages Functions에서 사용자 코드 실행
- Judge0 · Piston(emkc) · glot · onecompiler 등 원격 실행 API
- 미리보기 iframe에
allow-same-origin과allow-scripts동시
클라이언트에서만 하는 보완
- 실행 전 코드·프로젝트 크기 상한
- JS Worker 타임아웃 · HTML 미리보기 sandbox + 문서 CSP(
connect-src 'none') - 배포 전 시크릿·원격 실행 URL 스캔
서버 실행을 피해야 하는 이유
코딩 사이트에서 서버 실행을 열면 DoS(무한 루프), 채굴, 파일 탈취, 다른 사이트로의 공격 발신 등 “모르는 타인에게 쉘에 가까운 권한을 주는” 위험이 생깁니다. 이 프로젝트는 그 경로를 설계에서 제거합니다.
한계
브라우저 샌드박스는 강력하지만, 사용자는 자기 탭을 멈추게 할 수 있습니다. 타임아웃으로 완화합니다. C/C++ 실험은 패키지 다운로드가 크고 SharedArrayBuffer(COEP)가 필요합니다. C++ iostream·예외·전체 libstdc++는 환경에 따라 실패할 수 있습니다. 채점 카탈로그에는 아직 없습니다.