[python] Flask-RESTful에서 인증과 세션 관리 방법

Flask-RESTful은 Flask 프레임워크를 기반으로한 RESTful API 개발을 위한 확장 도구입니다. 이번 글에서는 Flask-RESTful을 사용하여 인증과 세션 관리를 어떻게 구현할 수 있는지 알아보겠습니다.

인증(Authentication) 개념

인증은 사용자가 자신이 주장하는 신원을 증명함으로써 보안 접근 제어를 수행하는 것을 의미합니다. Flask-RESTful에서는 인증을 구현하기 위해 일반적으로 JWT(JSON Web Token)을 사용합니다.

JWT는 클라이언트와 서버 간의 인증 정보를 안전하게 전달하기 위한 기술로, 타사 인증 서비스와의 통합도 용이하고 확장성이 높은 특징을 가지고 있습니다.

Flask-RESTful에서 JWT를 사용하여 인증을 구현하려면 다음과 같은 패키지를 설치해야 합니다.

pip install flask-jwt-extended

JWT 인증 구현하기

Flask-RESTful에서 JWT 인증을 위해 다음의 순서로 작업해야 합니다.

  1. Flask-JWT-Extended 초기화하기

먼저 Flask-RESTful 애플리케이션을 초기화하고 Flask-JWT-Extended 확장을 등록해야 합니다. 아래와 같은 코드를 app.py 파일에 추가합니다.

from flask_jwt_extended import JWTManager

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
jwt = JWTManager(app)
  1. 사용자 모델 생성하기

JWT 인증을 사용하기 위해서는 사용자 모델이 필요합니다. 사용자 모델은 데이터베이스에 저장된 사용자 정보를 나타내는 객체입니다. 사용자 모델은 아래와 같은 코드로 작성할 수 있습니다.

from flask_jwt_extended import get_jwt_identity

class User(db.Model):
    # 사용자 정보를 나타내는 필드들을 정의합니다.
    
    def generate_jwt(self):
        return jwt.encode({'id': self.id}, app.config['SECRET_KEY'], algorithm='HS256')
    
    @staticmethod
    def verify_jwt(token):
        try:
            decoded_token = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
            user_id = decoded_token['id']
            user = User.query.get(user_id)
            return user
        except:
            return None
  1. 인증 데코레이터 추가하기

Flask-RESTful에서는 특정 리소스에 대한 인증을 위해 @jwt_required 데코레이터를 사용합니다. 아래와 같은 코드로 리소스에 인증 데코레이터를 추가할 수 있습니다.

from flask_jwt_extended import jwt_required

class MyResource(Resource):
    
    @jwt_required
    def get(self):
        # 인증된 사용자만 접근 가능한 로직을 구현합니다.

세션(Session) 관리 개념

세션은 서버에 저장된 사용자 상태 정보를 유지하기 위한 메커니즘입니다. Flask-RESTful에서 세션을 관리하기 위해서는 클라이언트로부터 전달되는 세션 정보를 활용하여 상태를 유지합니다.

Flask-RESTful은 기본적으로 세션 관리를 지원하지 않지만, Flask 자체적으로 세션을 관리하는 기능을 제공하고 있습니다. Flask에서는 session 객체를 사용하여 세션 정보를 저장하고 조작할 수 있습니다.

세션 관리 구현하기

Flask-RESTful에서 세션을 관리하기 위해서는 다음과 같은 작업을 수행해야 합니다.

  1. 세션 시작

Flask의 session 객체를 사용하기 위해 먼저 세션을 시작해야 합니다. 아래와 같이 코드를 작성합니다.

from flask import session

@app.route('/')
def index():
    session['username'] = 'user1'
    return '세션 시작!'
  1. 세션 값 조회

세션에 저장된 값은 session 객체를 통해 조회할 수 있습니다. 아래와 같이 코드를 작성합니다.

from flask import session

@app.route('/')
def index():
    username = session.get('username')
    return f'현재 사용자: {username}'
  1. 세션 값 삭제

세션에 저장된 값을 삭제하려면 del 명령어를 사용합니다. 아래와 같이 코드를 작성합니다.

from flask import session

@app.route('/')
def index():
    del session['username']
    return '세션 값 삭제!'

Flask-RESTful에는 세션 관리를 위한 별도의 패키지나 확장기능은 없지만, Flask 자체적으로 제공하는 세션 관리 기능을 활용함으로써 필요한 세션 관리를 수행할 수 있습니다.

결론

이번 글에서는 Flask-RESTful에서 인증과 세션 관리를 어떻게 구현할 수 있는지 알아보았습니다. 인증은 JWT를 활용하여 구현하고, 세션 관리는 Flask의 session 객체를 활용하여 구현할 수 있습니다. 이러한 인증과 세션 관리 기능을 통해 안전하고 효율적인 RESTful API를 개발할 수 있습니다.