Authentication using Flask
신규 사용자 등록
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(100), unique=True)
password = db.Column(db.String(100))
name = db.Column(db.String(1000))
with app.app_context():
db.create_all()
파일 다운로드하기
암호화와 해싱
-
2단계 인증 암호화 Encryption : 사용자의 비밀번호를 받아 암호화 키로 보호
암호키를 알면 비번 암복호화가 가능, 보안에 취약 ⇨ Hashing -
Hashing : 비번을 해시 함수로 변환한 뒤 데이터베이스에 저장
해시 함수는 역처리가 거의 불가능하게 고안된 수학 방정식임 ⇨ 해시를 비번으로 복원하는 게 거의 불가능함 (순방향 연산은 빠르지만 역방향 연산은 거의 불가능)
Hacking Passwords 101
- 사용자 데이터베이스에 접근
- 흔히 사용할 수 있는 평문을 해시로 변환해서 비교
Hashing & Salting
- Salting : 해싱에서 좀 더 나아가 임의의 문자열 ‘솔트’를 생성해 비밀번호와 결합한 뒤 해시 함수에 통과 ⇨ 최종 해시는 비밀번호와 임의의 고유한 솔트로 만들어짐
MD5함수는 초당 200억 개의 해시를 생성할 수 있음 ⇨ 솔트 때문에 해시 테이블 생성이 까다로워진다 해도 최신 GPU 몇 개면 모든 솔트 조합을 고려한 해시 테이블이 빠르게 만들어짐 ⇨ 속도가 매우 느려서 유용한 해시 알고리즘 활용 bcrypt
bcrypt : 업계 표준인 해시 알고리즘 중 하나. 개발자들이 사용자 비밀번호 보호에 활용한다.
Salt Rounds : bcrypt를 이용해 비밀번호에 솔트를 여러번 결합. 횟수도 설정 가능
Werkzeug를 사용하여 비밀번호 해싱하기
Werkzeug란
- pbkdf2:sha256을 사용하여 비밀번호를 해시하고 솔트 길이(salt length) 8 추가하기
Flask_Login 패키지로 사용자 인증하기
💡등록, 로그인한 사용자만 해당 페이지를 보고 파일을 다운로드 하기
- Flask_Login을 사용
- user_loader 함수 생성
- 클래스에서 UserMixin 구현
※ Mixin은 파이썬에서 다중 상속을 제공하는 방법으로 Mixin을 추가하는 방법은 다음과 같다.
class MyClass(MixinClassB, MixinClassA, MixinClass):
UserMixin
flask_login에서 UserMixin은 Flask의 사용자 인증 시스템을 구현할 때 필요한 여러 속성과 메소드를 제공하는 편리한 클래스입니다.
이 믹스인 클래스는 사용자 모델에 통합되어 Flask-Login과 호환되는 사용자 모델을 쉽게 만들 수 있도록 도와줍니다.
UserMixin은 다음과 같은 메소드와 속성을 제공합니다:
- is_authenticated: 사용자가 인증되었는지 확인하는 속성입니다. 사용자가 유효한 자격 증명을 사용하여 로그인한 경우 True를 반환합니다.
- is_active: 사용자 계정이 활성 상태인지 확인하는 속성입니다. 예를 들어, 계정이 정지되었거나 비활성화된 경우 False를 반환할 수 있습니다.
- is_anonymous: 일반 사용자와는 달리 익명 사용자를 확인하는 속성입니다. 일반적으로 로그인한 사용자에 대해선 False를 반환합니다.
- get_id(): 사용자의 고유 식별자를 문자열로 반환하는 메소드입니다. Flask-Login은 이 메소드를 사용하여 사용자의 로그인 세션을 관리합니다.
UserMixin을 사용하는 방법은 간단합니다. 사용자 정의 사용자 모델 클래스에 UserMixin을 상속받게 함으로써, 위에 언급된 메소드와 속성을 자동으로 해당 사용자 모델에 추가할 수 있습니다. 예를 들어:
from flask_login import UserMixin
class User(UserMixin, db.Model):
# 여기에 모델 정의...
이렇게 하면 User 클래스는 Flask-Login이 요구하는 기본 인터페이스를 갖추게 되어, 로그인, 로그아웃 및 사용자 세션 관리 등의 기능을 쉽게 구현할 수 있게 됩니다.
- check_password_hash 함수를 사용하여 사용자의 비밀번호를 확인
- 로그인 양식에 입력한 이메일로 사용자 찾기
- 성공적으로 로그인 또는 등록한 경우 login_user()함수를 사용하여 인증
- 인증된 사용자만 액세스 할 수 있도록 /secrets과 /download경로를 모두 보호해야 함
Flask Flash Message
- 이메일이 데이터베이스에 없는 경우, 플래시 메시지 + 로그인 경로로 리디렉션
- 비번이 틀렸을 경우, 플래시 메시지 + 로그인 경로로 리디렉션
- 가입 메일이 이미 존재하는 경우, 플래시 메시지 + 로그인 경로로 리디렉션
인증상태를 템플릿에 전달하기
- 사용자가 로그인 했을 때 로그인/등록 버튼이 보이면 안됨
파일경로 : /Users/dana/Downloads/day-68-flask-auth-start