안녕하세요! 그레이 해커 월횽입니다. 오늘은 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
보호된 엔드포인트
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..."
}
· 보호된 엔드포인트 접근
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 애플리케이션에 대한 최적화 기법에 대해 알아보겠습니다!
- 이전 수업 목록
'프로그래밍 > Python' 카테고리의 다른 글
[Python 강의] 27강 - Flask 애플리케이션을 위한 보안 최적화 (0) | 2024.11.05 |
---|---|
[Python 강의] 26강 - Flask 애플리케이션에 대한 최적화 기법 (0) | 2024.11.04 |
[Python 강의] 24강 - REST API 설계 및 구현 (0) | 2024.10.31 |
[Python 강의] 23강 - Flask 웹소켓(WebSockets) (1) | 2024.10.30 |
[Python 강의] 22강 - Flask 애플리케이션 배포 (0) | 2024.10.29 |