코드 사용 전, 단서를 확인하라 — 10개의 개발 현장 사건으로 배우는 오픈소스 라이선스 의사결정 퀴즈
| 제출자 | 학번 | 실행 파일 |
|---|---|---|
| 안하람 | 2023612016 | app.py |
Python + Streamlit으로 만든 중간고사 대체 과제입니다. MIT, Apache-2.0, BSD-3-Clause, GPL, LGPL, AGPL, CC BY-NC 및 무라이선스 저장소처럼 실제 프로젝트에서 마주칠 법한 상황을 사건 파일로 재구성했습니다.
이 앱은 학습용 시뮬레이션이며 실제 사안에 대한 법률 자문이 아닙니다. 구체적인 판단에는 라이선스 원문과 전문가 검토가 필요합니다.
- 첫 화면 제출자 정보: 로그인 전 첫 화면 상단에 학번과 이름을 항상 표시합니다.
- 실제 로그인 처리: 사용자 입력, 성공·실패 피드백, 실패 횟수, 세션 로그인 상태 및 로그아웃을 구현했습니다.
- 의미 있는 캐싱:
st.cache_data로 퀴즈 JSON 읽기, 스키마 검증, 체크섬 계산, 분야·라이선스 색인 생성을 재사용합니다. - 10단계 사건형 퀴즈: 문제 제시 → 사용자 판단/확신도 입력 → 정답 계산 → 현장 노트 → 최종 보고서 흐름입니다.
- 개인화 결과: 총점, 수사관 등급, 네 분야별 역량, 과신 단서와 숨은 실력을 분석합니다.
- 공식 근거 연결: 각 문제의 설명에서 OSI, Apache, GNU, GitHub Docs, Creative Commons, SPDX 원문으로 이동할 수 있습니다.
- 반응형 다크 UI: 외부 이미지 없이 증거 보드·사건 서류 콘셉트를 CSS로 구성했습니다.
아이디: detective
비밀번호: license2026
비밀번호 원문을 인증 코드에 직접 비교하지 않고 SHA-256 해시와 hmac.compare_digest를 사용합니다. 이는 로그인 상태 처리를 보여 주는 수업용 데모이며 실제 서비스 인증을 대체하지 않습니다.
Python 3.11 이상을 권장합니다.
git clone https://github.com/ahnharam/oss-license-detective.git
cd oss-license-detective
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
streamlit run app.pygit clone https://github.com/ahnharam/oss-license-detective.git
cd oss-license-detective
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
streamlit run app.py브라우저에서 http://localhost:8501을 열면 됩니다. 외부 배포는 필요하지 않습니다.
Streamlit은 라디오 버튼, 슬라이더, 메뉴 같은 위젯을 조작할 때마다 스크립트를 위에서부터 다시 실행합니다. 캐시가 없다면 매번 다음 작업이 반복됩니다.
- UTF-8 JSON 파일 읽기와 파싱
- 필수 필드·중복 ID·정답·HTTPS 근거 링크 검증
- 데이터 SHA-256 지문 생성
- 카테고리 집계와 라이선스 역색인 구축
src/data_loader.py의 load_quiz_bundle()에 @st.cache_data를 적용했습니다. 파일 수정 시각(st_mtime_ns)을 캐시 키에 넣어 원본 JSON이 바뀌면 자동으로 새 데이터를 만들고, 바뀌지 않으면 위 작업을 재사용합니다.
앱의 캐시 감식실에서 다음을 직접 확인할 수 있습니다.
- 메뉴를 오가도 캐시 생성 시각과 데이터 지문이 유지되는지 확인
- 캐시 적중 속도 측정
- 함수 전용 캐시를 비운 뒤 새 생성 시각 확인
로그인 상태와 퀴즈 답변은 사용자별 상태이므로 캐시하지 않고 st.session_state에 저장합니다.
- 10문제, 문제당 10점, 총 100점
90–100: 라이선스 아키텍트70–89: 컴플라이언스 탐정50–69: 수습 조사관0–49: 증거 보강 필요
문제는 다음 네 분야로 분석됩니다.
| 분야 | 확인하는 능력 |
|---|---|
| 고지·귀속 | LICENSE, NOTICE, 저작권 고지와 변경 표시 |
| 소스 공개 판단 | GPL/LGPL/AGPL의 배포·재링크·네트워크 조건 |
| 리스크 감지 | 무라이선스 코드, 콘텐츠·데이터의 이용 제한 |
| 커뮤니티 존중 | 비보증, 기여 계보와 이름·명성의 올바른 사용 |
확신도는 점수를 바꾸지 않습니다. 대신 높은 확신으로 틀린 과신 단서와 낮은 확신으로 맞힌 숨은 실력을 별도 표시합니다.
oss-license-detective/
├─ app.py # Streamlit 메인 실행 파일
├─ SUBMISSION.md # 최종 과제 제출 주소와 상태
├─ data/quiz.json # 10개 사건, 라이선스 카드, 공식 근거
├─ src/
│ ├─ auth.py # 해시 기반 데모 인증
│ ├─ config.py # 제출자·앱 설정
│ ├─ data_loader.py # JSON 검증 및 st.cache_data
│ └─ quiz_engine.py # 순수 채점·결과 로직
├─ tests/ # 단위 테스트와 Streamlit UI 스모크 테스트
├─ docs/
│ ├─ ASSIGNMENT_CHECKLIST.md # 노션 요구사항 대응표
│ └─ DEMO_SCRIPT.md # YouTube 데모 촬영 대본
├─ .streamlit/config.toml # 앱 테마
├─ .github/workflows/tests.yml # GitHub Actions 자동 테스트
├─ .gitignore # Python 프로젝트 제외 규칙
├─ requirements.txt # 실행 의존성
└─ requirements-dev.txt # 테스트 의존성
python -m pip install -r requirements-dev.txt
python -m pytest -q테스트 범위는 인증 성공·실패, 데이터 스키마 오류, 캐시 재사용, 0–100점 채점 경계, 결과 등급, 첫 화면 학번·이름, 로그인 UI 흐름입니다. GitHub에 push하면 같은 테스트가 Actions에서 자동 실행됩니다.
- 최종 제출 정보
- 노션 요구사항 대응표
- 데모 영상 촬영 대본과 체크리스트
- GitHub 저장소: https://github.com/ahnharam/oss-license-detective
- YouTube 일부 공개 링크: https://youtu.be/wt5jfglwSH0
- Open Source Initiative — MIT License
- Open Source Initiative — BSD 3-Clause License
- Apache Software Foundation — Apache License 2.0
- GNU — GPL 3.0
- GNU — LGPL 3.0
- GNU — AGPL 3.0
- GitHub Docs — Licensing a repository
- Creative Commons — CC BY-NC 4.0
- SPDX Specifications
애플리케이션 코드는 MIT License로 공개합니다. data/quiz.json의 문항과 설명은 본 과제를 위해 직접 구성했습니다.

