오늘 학습한 내용
- git 명령어 정리
- 데이터 베이스 연결 및 설정
- 전체적으로 다듬기
- 회원가입 / 로그인은 작동하는데 오류 없고 DB에도 잘 들어감
어려운 내용(추가 학습 필요)
오늘 발생한 문제(발생 했다면)
오늘의 공부 정리
FastAPI 인증(Authorization) 흐름의 구조 이해
login → JWT 발급 → Authorization 헤더로 전달 → Depends(oauth2_scheme)
→ get_current_user → 보호된 API 실행
- “요청이 들어올 때마다 Depends(oauth2_scheme)를 통해 토큰을 해석한다”
- 즉,
Authorization: Bearer <token>
- FastAPI가 토큰만 추출
get_current_user() 에서 디코딩
- DB로 사용자 조회.
JWT의 동작 원리 (FastAPI + jose + passlib)
- header: 암호화 알고리즘 정보 (HS256)
- payload: 실제 데이터 (sub, exp, user_id)
- signature: header + payload + SECRET_KEY 로 해시한 값
- 즉, 서버는 JWT를 “저장”하지 않고 “검증만” 함
- 로그아웃을 구현하려면 “서버가 기억해야 하므로” blacklist DB가 필요
Tortoise ORM의 ORM 패턴과 비동기 흐름
await User.get_or_none(username=username)
await User.create(**data)
await User.filter(email=email).update(...)
- get_or_none() : 존재하지 않으면 None 반환 (try/except 필요 X)
- filter().update() : SQL UPDATE 직접 수행 (성능 좋음)
- Prefetch 나 select_related() : 관계 데이터 미리 불러오기 (JOIN)
- Tortoise는 “비동기 ORM”이기 때문에, await를 잊으면 작동은 하지만 결과가 틀릴 수 있음
PostgreSQL과 ORM의 관계
- Tortoise ORM은 결국 PostgreSQL 쿼리를 자동 생성하는 도구
| 개념 | ORM 표현 | SQL 표현 |
|---|
| SELECT | User.all() | SELECT * FROM user; |
| WHERE | User.filter(username="kihoon") | WHERE username='kihoon' |
| JOIN | select_related("profile") | JOIN profile ON ... |
실제 서비스 기준 인증 확장 포인트
- JWT + Blacklist 구조는 "학습용"
| 개념 | 역할 |
|---|
| Access Token / Refresh Token | 짧은 만료시간 + 자동 재발급 |
| CSRF | 브라우저 환경 보호 (JWT 쿠키 보관 시) |
| OAuth2 Social Login | Google, Kakao 등 외부 로그인 |
| Dependency Override | 테스트 시 가짜 사용자 주입 |