보안한 Flask 로그인 시스템 구축 방법
카테고리
인프라/DevOps/보안
서브카테고리
보안
대상자
- 초보 개발자 및 보안 엔지니어
- Flask 프레임워크와 웹 보안 기초를 배우고자 하는 사람들
- 난이도: 중간 (기초 Python/Flask 지식 필수)
핵심 요약
generate_password_hash()
및check_password_hash()
사용으로 비밀번호 해싱 보장app.secret_key
설정을 통한 보안 세션 관리- HTML 폼 유효성 검증 및 Flask 내장 요청 정화 기능으로 입력 정화 구현
섹션별 세부 요약
1. 프로젝트 목적
- 실무적 로그인 시스템 구축을 통한 보안 취약점 분석 및 대응 학습
- 초보자 친화적인 실습 프로젝트 제공
2. 사용 기술 스택
- Python 3.11, Flask, SQLite, Werkzeug
- 보안 기능:
generate_password_hash()
/check_password_hash()
- 세션 관리 (
session['user']
,app.secret_key
) - 입력 정화 (HTML 폼 필수 입력값, Flask 요청 정화)
3. 로그인 시스템 구현
/login
경로에서 POST 요청 처리:- 사용자 존재 여부 확인
check_password_hash()
로 비밀번호 검증- 성공 시
session['user']
에 사용자 저장 /register
경로에서 사용자 등록:generate_password_hash()
로 비밀번호 해싱- SQLite 대신 임시 딕셔너리
users
사용
4. 보안 강화 방법
- 비밀번호 해싱: Werkzeug의 SHA256 알고리즘 사용
- 세션 보안:
app.secret_key
로 세션 서명 - 오류 노출 방지: 로그인 실패 시 스택 트레이스 노출 없음
- 비밀번호 암호화: 평문 저장 금지 (해싱 필수)
5. 피해야 할 실수
- SQL 주입 취약점 방지: 원시 쿼리 사용 금지
- 평문 비밀번호 저장 금지
- 프론트엔드에 민감한 디버깅 정보 노출 금지
- 비안전한 라이브러리(예:
eval()
) 사용 금지
6. 향후 개선 사항
- SQLite로 데이터베이스 영속화
- JWT 토큰 또는 세션 만료 기능 추가
- Flask-WTF를 통한 CSRF 보호 구현
- N회 로그인 실패 후 계정 잠금 및 실패 시도 로깅
7. 학습 요약
- 로그인 계층의 취약점 분석 방법
- 해싱의 중요성 (비밀번호 보호)
- 보안은 지속적인 프로세스 (단일 기능이 아닌 지속적 사고 필요)
결론
generate_password_hash()
/check_password_hash()
사용과app.secret_key
설정은 필수- 입력 정화 및 오류 메시지 최소화를 통해 보안 강화
- JWT, CSRF 보호, 로그인 시도 제한 등 추가 보안 기능 구현 권장
- 보안은 지속적인 개선 과정으로, 취약점 분석 및 수정을 반복해야 함