Authentication using Flask


22



신규 사용자 등록


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


1



파일 다운로드하기

3


4



암호화와 해싱

  • 2단계 인증 암호화 Encryption : 사용자의 비밀번호를 받아 암호화 키로 보호
    암호키를 알면 비번 암복호화가 가능, 보안에 취약 ⇨ Hashing

  • Hashing : 비번을 해시 함수로 변환한 뒤 데이터베이스에 저장
    해시 함수는 역처리가 거의 불가능하게 고안된 수학 방정식임 ⇨ 해시를 비번으로 복원하는 게 거의 불가능함 (순방향 연산은 빠르지만 역방향 연산은 거의 불가능)


Crypii 사이트


5



Hacking Passwords 101

  • 사용자 데이터베이스에 접근
  • 흔히 사용할 수 있는 평문을 해시로 변환해서 비교



Hashing & Salting

  • Salting : 해싱에서 좀 더 나아가 임의의 문자열 ‘솔트’를 생성해 비밀번호와 결합한 뒤 해시 함수에 통과 ⇨ 최종 해시는 비밀번호와 임의의 고유한 솔트로 만들어짐

MD5함수는 초당 200억 개의 해시를 생성할 수 있음 ⇨ 솔트 때문에 해시 테이블 생성이 까다로워진다 해도 최신 GPU 몇 개면 모든 솔트 조합을 고려한 해시 테이블이 빠르게 만들어짐 ⇨ 속도가 매우 느려서 유용한 해시 알고리즘 활용 bcrypt

bcrypt : 업계 표준인 해시 알고리즘 중 하나. 개발자들이 사용자 비밀번호 보호에 활용한다.

Salt Rounds : bcrypt를 이용해 비밀번호에 솔트를 여러번 결합. 횟수도 설정 가능



Werkzeug를 사용하여 비밀번호 해싱하기


Werkzeug란

6


  • pbkdf2:sha256을 사용하여 비밀번호를 해시하고 솔트 길이(salt length) 8 추가하기

10


9


7


8



Flask_Login 패키지로 사용자 인증하기


💡등록, 로그인한 사용자만 해당 페이지를 보고 파일을 다운로드 하기

  • Flask_Login을 사용
  • user_loader 함수 생성


11


  • 클래스에서 UserMixin 구현
    ※ Mixin은 파이썬에서 다중 상속을 제공하는 방법으로 Mixin을 추가하는 방법은 다음과 같다.
  
class MyClass(MixinClassB, MixinClassA, MixinClass):
  



UserMixin

flask_login에서 UserMixin은 Flask의 사용자 인증 시스템을 구현할 때 필요한 여러 속성과 메소드를 제공하는 편리한 클래스입니다. 이 믹스인 클래스는 사용자 모델에 통합되어 Flask-Login과 호환되는 사용자 모델을 쉽게 만들 수 있도록 도와줍니다.
UserMixin은 다음과 같은 메소드와 속성을 제공합니다:

  1. is_authenticated: 사용자가 인증되었는지 확인하는 속성입니다. 사용자가 유효한 자격 증명을 사용하여 로그인한 경우 True를 반환합니다.
  2. is_active: 사용자 계정이 활성 상태인지 확인하는 속성입니다. 예를 들어, 계정이 정지되었거나 비활성화된 경우 False를 반환할 수 있습니다.
  3. is_anonymous: 일반 사용자와는 달리 익명 사용자를 확인하는 속성입니다. 일반적으로 로그인한 사용자에 대해선 False를 반환합니다.
  4. get_id(): 사용자의 고유 식별자를 문자열로 반환하는 메소드입니다. Flask-Login은 이 메소드를 사용하여 사용자의 로그인 세션을 관리합니다.
    UserMixin을 사용하는 방법은 간단합니다. 사용자 정의 사용자 모델 클래스에 UserMixin을 상속받게 함으로써, 위에 언급된 메소드와 속성을 자동으로 해당 사용자 모델에 추가할 수 있습니다. 예를 들어:
from flask_login import UserMixin

class User(UserMixin, db.Model):
    # 여기에 모델 정의...

이렇게 하면 User 클래스는 Flask-Login이 요구하는 기본 인터페이스를 갖추게 되어, 로그인, 로그아웃 및 사용자 세션 관리 등의 기능을 쉽게 구현할 수 있게 됩니다.

  • check_password_hash 함수를 사용하여 사용자의 비밀번호를 확인
  • 로그인 양식에 입력한 이메일로 사용자 찾기
  • 성공적으로 로그인 또는 등록한 경우 login_user()함수를 사용하여 인증


14


12


13


  • 인증된 사용자만 액세스 할 수 있도록 /secrets과 /download경로를 모두 보호해야 함

15



Flask Flash Message

  • 이메일이 데이터베이스에 없는 경우, 플래시 메시지 + 로그인 경로로 리디렉션
  • 비번이 틀렸을 경우, 플래시 메시지 + 로그인 경로로 리디렉션


18


17


  • 가입 메일이 이미 존재하는 경우, 플래시 메시지 + 로그인 경로로 리디렉션


16



인증상태를 템플릿에 전달하기

  • 사용자가 로그인 했을 때 로그인/등록 버튼이 보이면 안됨

19


20


21


파일경로 : /Users/dana/Downloads/day-68-flask-auth-start