프로그래밍/Python

[Python 강의] 25강 - Flask에서 JWT를 사용한 인증 시스템

월횽 2024. 11. 1. 14:26
728x90
반응형
SMALL

안녕하세요! 그레이 해커 월횽입니다. 오늘은 Flask와 JWT(Json Web Token)를 사용하여 안전한 인증 시스템을 구축하는 방법에 대해 알아보겠습니다. JWT는 서버와 클라이언트 간에 정보를 안전하게 전송하는 데 유용하며, 주로 인증에 사용됩니다. 이를 통해 클라이언트가 로그인을 한 후 인증된 사용자임을 확인할 수 있습니다.

 

 

1. JWT란?

JWT는 JSON 형식의 데이터를 URL-safe 방식으로 인코딩하여 서버와 클라이언트 간에 정보를 안전하게 전달하는 토큰입니다. JWT는 세 부분으로 구성됩니다.

· Header: 알고리즘과 타입 정보를 포함
· Payload: 토큰에 포함할 정보(예: 사용자 ID 등)
· Signature: 토큰의 무결성을 보장하는 서명

 

 

2. Flask에서 JWT 설정하기

JWT를 사용하기 위해 Flask-JWT-Extended 라이브러리를 사용합니다. 이 라이브러리를 통해 로그인, 인증된 사용자 확인 등을 쉽게 구현할 수 있습니다.

pip install flask-jwt-extended

 

반응형

기본 설정

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-key'  # 실제 앱에서는 강력한 비밀 키를 사용하세요
jwt = JWTManager(app)

 

 

 

3. JWT를 이용한 로그인 및 인증 구현하기

 

사용자 로그인 엔드포인트

사용자가 로그인할 때 유효한 정보를 입력하면 JWT 토큰을 생성하여 반환합니다. 일반적으로 데이터베이스에서 사용자를 조회하여 정보가 일치하는지 확인해야 하지만, 여기서는 예제이므로 간단한 사용자 정보를 직접 작성합니다.

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

    # 실제 애플리케이션에서는 데이터베이스에서 사용자 인증을 수행
    if username == 'admin' and password == 'password':  # 예제 사용자
        access_token = create_access_token(identity=username)
        return jsonify(access_token=access_token), 200
    else:
        return jsonify({"msg": "사용자 정보가 올바르지 않습니다."}), 401

 

728x90

보호된 엔드포인트

JWT가 필요한 보호된 엔드포인트를 설정하여 인증된 사용자만 접근할 수 있게 합니다. jwt_required 데코레이터를 사용하여 보호됩니다.

# 보호된 엔드포인트 (인증된 사용자만 접근 가능)
@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
    current_user = get_jwt_identity()
    return jsonify(logged_in_as=current_user), 200

 

 

 

4. JWT 인증 흐름 테스트

테스트 도구 Postman이나 curl을 통해 JWT 기반의 인증을 쉽게 테스트할 수 있습니다.

 

· 로그인하여 토큰 받기

curl -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "password"}' http://127.0.0.1:5000/login

 

 

응답 예시

{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
}

 

SMALL

· 보호된 엔드포인트 접근

curl -X GET -H "Authorization: Bearer <YOUR_ACCESS_TOKEN>" http://127.0.0.1:5000/protected

 

<YOUR_ACCESS_TOKEN>을 이전 단계에서 받은 access_token 값으로 대체하여 요청합니다.

 

 

5. Flask에서 JWT 모범 사례

토큰 만료 시간 설정: 토큰의 만료 시간을 설정하여 보안을 강화합니다.

app.config['JWT_ACCESS_TOKEN_EXPIRES'] = timedelta(hours=1)

· 토큰 갱신: 일정 시간이 지나면 토큰을 갱신하여 보안성을 높일 수 있습니다.
· HTTPS 사용: 토큰 전송 시 HTTPS를 통해 암호화된 연결을 유지합니다.

6. JWT를 통한 인증의 장점

· 무상태성: JWT는 서버에 세션을 저장하지 않으므로 무상태성(stateless)을 유지할 수 있습니다.
· 확장성: 인증에 세션을 사용하지 않기 때문에 서버 확장성이 뛰어납니다.

 

다음 시간에는 Flask 애플리케이션에 대한 최적화 기법에 대해 알아보겠습니다!

 

 

 

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST