# Cursor에서 내 CSV 결과 조회 앱 실행하기

Python 3.10 이상과 Cursor가 필요합니다. Node.js, DB, 별도 Worker는 필요하지 않습니다.
이 폴더(app.py가 있는 위치)를 Cursor의 File → Open Folder로 열고 Terminal → New Terminal에서 실행하세요.

```powershell
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe app.py
```

py가 없으면 첫 명령의 py를 python으로 바꿉니다. 가상환경 활성화는 필요하지 않습니다.
첫 패키지 설치에는 인터넷이 필요합니다. 서버 터미널을 켜 두고 http://127.0.0.1:5000 을 여세요.
localhost가 아닌 위 주소를 사용합니다. 종료는 Ctrl+C, 다시 실행할 때는 마지막 명령만 사용합니다.

## 가상 계정과 확인

두 계정은 mina와 joon이고 공통 비밀번호는 study1234입니다. 실제 비밀번호를 입력하지 마세요.

1. 로그인 전 내 결과 조회 → 401.
2. 틀린 비밀번호로 로그인 → 401.
3. mina로 로그인하고 조회 → mina-001만 보임.
4. 다른 계정 결과 접근 확인 → 403. /api/results/joon-001 직접 접근도 403.
5. 새로고침 → 로그인 유지. /api/results/not-found → 404.
6. 로그아웃 후 조회 → 401, 기존 결과 지워짐.
7. joon으로 로그인 → joon-001만 보임, mina 결과는 403.
8. 서버 재시작 후 새로고침 → 로그인 해제, sample-results.json은 그대로 남음.

개발자도구 Network에서 실제 응답을 확인합니다. Cookies에서 ax_lab_session의 HttpOnly 설정을 확인합니다.
쿠키를 임의 값으로 바꾸면 조회는 401입니다. SESSION_TTL을 5로 바꾸고 재시작·로그인한 뒤 5초 후 조회하면 만료를 확인할 수 있습니다. 확인 후 1800으로 되돌리세요.

## 파일과 상태

- app.py: Flask 화면·API, 비밀번호 해시 검증, 서버 메모리 세션, 소유자 검사.
- templates/index.html: 로그인·결과 조회 화면.
- sample-results.json: 가상 결과 파일. owner는 교육용으로 추가한 소유자이며 W19 Worker 원본에는 없습니다.
- requirements.txt: Flask 의존성. .venv/와 __pycache__/는 Git에서 제외.

세션 ID는 secrets로 생성하고 쿠키에는 ID만 저장합니다. 세션은 1800초 후 만료되며 로그아웃 시 서버에서도 폐기됩니다.
Flask 기본 session은 서명된 쿠키 방식이므로 이 예제에서는 별도 딕셔너리를 사용합니다.
로컬 HTTP 교육용이므로 Secure 쿠키는 사용하지 않습니다. 인터넷 배포는 이 실습 범위가 아닙니다.
실제 서비스에는 HTTPS, Secure 쿠키, 영속 세션 저장소, 로그인 시도 제한 등 별도 운영 설계가 필요합니다.

## 막혔을 때

- 파일을 못 찾으면 터미널 위치가 app.py 폴더인지 확인합니다.
- Flask를 못 찾으면 설치와 실행 모두 .venv의 python.exe를 사용하는지 확인합니다.
- 포트 사용 중이면 전에 실행한 실습 서버의 터미널에서 Ctrl+C로 종료합니다.
- 연결 실패 시 서버가 켜져 있는지 확인합니다. HTML을 더블클릭해 열지 않습니다.
- 400/403 주소 오류 시 http://127.0.0.1:5000 주소를 확인합니다.

참고 코드 검증(저장소 루트에서): `python -m unittest discover -s week-20/tests -v`
ZIP에는 테스트가 포함되지 않으며 Flask가 설치된 Python으로 검사합니다.
