Flask에서 인증 기능을 구현하는 방법은 다양할 수 있지만, 여기에서는 JWT(JSON Web Token)를 사용하여 간단하게 인증 기능을 구현하는 방법을 소개하겠습니다.
필요 패키지 설치
먼저 필요한 패키지들을 설치합니다.
pip install flask flask_jwt_extended
인증 기능 넣기
이제 아래와 같이 JWT 설정과 사용자 정보를 임시로 저장할 딕셔너리를 만들어줍니다.
from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, get_jwt_identity
app = Flask(__name__)
# JWT 설정
app.config['JWT_SECRET_KEY'] = 'super-secret'
jwt = JWTManager(app)
# 임시 사용자 정보
users = {
'test': {
'password': 'test'
}
}
위 코드에서 JWT_SECRET_KEY는 JWT에서 사용되는 시크릿 키로, 랜덤한 값으로 설정해줍니다. 그리고 다음과 같이 로그인 엔드포인트를 추가해줍니다.
@app.route('/login', methods=['POST'])
def login():
username = request.json.get('username', None)
password = request.json.get('password', None)
if not username or not password:
return jsonify({'msg': '아이디 또는 비밀번호를 입력하세요.'}), 400
if username not in users or password != users[username]['password']:
return jsonify({'msg': '아이디 또는 비밀번호가 일치하지 않습니다.'}), 401
# JWT 생성
access_token = create_access_token(identity=username)
return jsonify({'access_token': access_token}), 200
위 코드에서는 '/login' 엔드포인트에서 사용자가 입력한 아이디와 비밀번호를 확인하여 인증이 되면 JWT를 생성하여 반환합니다. 만약 아이디 또는 비밀번호가 일치하지 않으면 401 Unauthorized 에러를 반환합니다.
그리고 아래와 같이 보호된 엔드포인트를 추가해줍니다.
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
current_user = get_jwt_identity()
return jsonify({'msg': f'{current_user}님, 인증에 성공하셨습니다!'}), 200
위 코드에서는 '/protected' 엔드포인트에서 @jwt_required 데코레이터를 사용하여 JWT가 필요한 엔드포인트임을 명시하고, 현재 사용자 정보를 확인하여 응답합니다.
이제 API 서버를 실행하고, '/login' 엔드포인트에서 인증을 진행한 후, 반환받은 JWT를 Header에 'Authorization: Bearer <token>' 형태로 넣어 '/protected' 엔드포인트에 요청하면 인증이 되어 응답을 받을 수 있습니다.
참고자료
[1] https://flask-jwt-extended.readthedocs.io/en/stable/basic_usage/
'Dev > python' 카테고리의 다른 글
[pandas] dataframe 특정 컬럼 값에 일괄적으로 함수 적용, apply 메소드 (0) | 2023.03.17 |
---|---|
[pandas] 데이터프레임을 to_csv() 메소드로 csv 파일로 저장할 때 한글 깨짐 문제 해결 방법 (0) | 2023.03.15 |
[sqlalchemy] from sqlalchemy import nullslast 에러 해결법 (0) | 2023.03.06 |
PyQt6와 PySide6의 라이선스 차이 (0) | 2023.02.20 |
[flask] ModuleNotFoundError: No module named 'wtforms.fields.html5' 에러 해결 방법 (2) | 2023.01.31 |
[python] 클래스 속성과 클래스 메서드 (0) | 2023.01.28 |
[python] 정적 메서드(static method)는 주로 어떤 경우에 사용되는가 (0) | 2023.01.27 |
[python] 비공개 속성, 게터, 세터, @property (0) | 2023.01.26 |