API 개발/API (Back-end)

[APl] flask_jwt_extended 모듈 ,access token, 로그인 했을시 권한 부여

코끼리똥11 2024. 5. 22. 17:55

flask_jwt_extended

flask_jwt_extended 모듈은 Flask 애플리케이션에서 JSON Web Tokens(JWT)을 사용하여 사용자 인증 및 권한 부여를 처리하는 데 사용된다. 이 모듈은 Flask-JWT의 확장된 버전으로, 추가적인 기능과 유연성을 제공한다.

  1. create_access_token: 이 함수는 JWT(access token)를 생성한다. 사용자 ID와 함께 호출되어 사용자를 인증하고, 액세스 토큰을 발급한다. 일반적으로 사용자가 로그인하거나 권한이 필요한 엔드포인트에 액세스할 때 호출된다.
  2. jwt_required: 이 데코레이터는 엔드포인트에 액세스하는 사용자가 JWT(access token)를 제공해야 함을 나타낸다. 사용자가 유효한 JWT를 제공하지 않으면 엔드포인트에 액세스할 수 없다.
  3. get_jwt: 이 함수는 현재 요청에 대한 JWT의 정보를 반환한다. 주로 엔드포인트에서 JWT에 관련된 추가적인 정보를 확인하는 데 사용된다.

이러한 함수들은 사용자 인증 및 권한 관리를 위해 사용된다. 특히 웹 애플리케이션에서 사용자의 로그인 상태를 관리하고, 사용자의 권한을 확인하여 특정 엔드포인트에 대한 액세스를 제어하는 데 유용하다.

 

 

예시

from flask import Flask, jsonify, request
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret'  # JWT 암호화에 사용되는 시크릿 키 설정
jwt = JWTManager(app)

# 사용자 데이터베이스를 가정한 리스트
users = [
    {'id': 1, 'username': 'user1', 'password': 'password1'},
    {'id': 2, 'username': 'user2', 'password': 'password2'}
]

# 로그인 엔드포인트
@app.route('/login', methods=['POST'])
def login():
    data = request.json
    username = data.get('username')
    password = data.get('password')

    # 사용자 인증
    user = next((user for user in users if user['username'] == username and user['password'] == password), None)
    if user:
        # 유효한 사용자인 경우, JWT 생성
        access_token = create_access_token(identity=user['id'])
        return jsonify({'access_token': access_token}), 200
    else:
        return jsonify({'message': 'Invalid username or password'}), 401

# 보호된 엔드포인트
@app.route('/protected', methods=['GET'])
@jwt_required()  # 액세스 토큰이 필요한 엔드포인트에 사용되는 데코레이터
def protected():
    # 사용자 ID 가져오기
    user_id = get_jwt_identity()
    # 사용자 ID를 사용하여 작업 수행
    return jsonify({'user_id': user_id}), 200

if __name__ == '__main__':
    app.run(debug=True)
    1. create_access_token(identity, expires_delta=None, fresh=False): 사용자를 인증하고 액세스 토큰을 생성한다. identity는 사용자를 고유하게 식별하는 값이며, 주로 사용자 ID가 된다. expires_delta는 토큰 만료 시간을 지정하는데 사용되며, fresh는 액세스 토큰이 "신선한(fresh)"하다는 것을 나타낸다. 기본적으로 토큰은 신선하지 않는다.
    2. @jwt_required() 데코레이터: 엔드포인트에 대한 액세스 토큰이 필요하다는 것을 나타낸다. 이 데코레이터를 사용하면 해당 엔드포인트에 접근하려는 모든 요청에 대해 토큰이 필요하다.
    3. get_jwt_identity(): 현재 요청에 대한 JWT의 식별자(identity)를 반환한다. 이 함수를 사용하면 현재 사용자를 고유하게 식별할 수 있다.
    4. jwt_required() 데코레이터와 함께 사용되는 get_jwt_identity(): 이 두 가지를 함께 사용하면 보호된 엔드포인트에서 현재 사용자의 식별자를 가져와 작업을 수행할 수 있다.
    5. @jwt.token_in_blocklist_loader: JWT 블랙리스트에 대한 사용자 지정 로더 함수를 정의하는 데 사용된다. 이 함수는 JWT의 JTI(JWT ID)가 블랙리스트에 있는지 여부를 확인한다.
    flask_jwt_extended를 사용하면 JWT를 기반으로 한 강력한 인증 및 권한 부여 시스템을 손쉽게 구현할 수 있다.