2023-02-19 22:57:56

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/