JWT
란 "JSON Web Token" 의 약자이다.JWT
는 웹표준(RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 통신한다.JWT
는 필요한 모든 정보를 자체적으로 지니고 있다.JWT
는 웹서버의 경우 HTTP의 헤더에 넣어서 전달할 수도 있고, URL의 파라미터로 전달할 수도 있다.웹서버에서 JSON 을 통해 쉽게 인증을 하기 위해서 사용하는 거 같은데 ?
Header.PayLoad.Signature
로 만들어진다.
Header와 Payload는 누구나 디코딩하여 내용을 확인할 수 있기 때문에 유저의 비밀번호 같은 정보는 넣지 않도록 한다. 하지만 Secret Key를 알지 못하면 VerifySignature는 복호화할 수 없다.
"JWT란?" 에 관련된 글
https://velopert.com/2389
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/
https://sanghaklee.tistory.com/47
사용자가 로그인을 했을 때, 로그인을 어떻게 유지 시키는 방법은 다양한 방법으로 진화해왔다.
Cookie, Session 그 다음 단계를 거친 것이 바로 JWT
를 이용한 토큰 방식의 사용자 인증 방식이다.
간략하게 설명하자면 토큰에 사용자 정보를 식별할 수 있는 정보를 담아 놓고, 인증이 필요할 때 이 JWT token
을 사용하는 방식이다.
Flask-JWT
보다 Flask-JWT-Extended
가 더 많은 기능을 가지고 있다.
또한 해당 pypi.org 사이트를 들어가 봤을 때, Release history 를 보면 Flask-JWT
는 마지막 Release 가 2015/11월 이고, Flask-JWT-Extended
는 2019/10월 이다.
이것만 봐도 어떤 것이 더 활성화 되는지 알 수 있다.
또한 https://pypi.org/project/Flask-JWT-Extended/ 해당 페이지의 Features 부분을 보면 "Flask-JWT-Extended
는 View를 보호하기 위해 Flask에 JSON Web Token
(JWT) 사용에 대한 지원을 추가 할 뿐만 아니라 JSON Web Token
을 더 쉽게 사용할 수 있도록 내장 된 많은 유용한 (및 선택적 ) 기능도 추가합니다." 이렇게 적혀있다.
pip install Flask-JWT-Extended
"""
__init__.py
"""
from flask import Flask, request, jsonify
from flask_jwt_extended import (
JWTManager, jwt_required, create_access_token, get_jwt_identity
)
app = Flask(__name__)
# Setup the Flask-JWT-Extended extension
app.config['JWT_SECRET_KEY'] = 'super-secret' # Change this!
jwt = JWTManager(app)
# Provide a method to create access tokens. The create_access_token()
# function is used to actually generate the token, and you can return
# it to the caller however you choose.
@app.route('/login', methods=['POST'])
def login():
if not request.is_json:
return jsonify({"msg": "Missing JSON in request"}), 400
username = request.json.get('username')
password = request.json.get('password')
if not username:
return jsonify({"msg": "Missing username parameter"}), 400
if not password:
return jsonify({"msg": "Missing password parameter"}), 400
if username != 'test' or password != 'test':
return jsonify({"msg": "Bad username or password"}), 401
# Identity can be any data that is json serializable
access_token = create_access_token(identity=username)
return jsonify(access_token=access_token), 200
# Protect a view with jwt_required, which requires a valid access token
# in the request to access.
@app.route('/protected', methods=['GET'])
@jwt_required
def protected():
# Access the identity of the current user with get_jwt_identity
current_user = get_jwt_identity()
return jsonify(logged_in_as=current_user), 200
from flask_jwt_extended import (JWTManager, jwt_required, create_access_token, get_jwt_identity)
app.config['JWT_SECRET_KEY'] = 'super-secret'
위의 문장은 config.py 로 옮겨서 적을 수도 있다.
(아래와 같이 secret-key는 분리해서 적은 뒤 gitignore 하는게 좋다.)
# config.py
import os
class Config(object):
JWT_SECRET_KEY = 'super-secert'
#1
jwt = JWTManager(app) # flask instance에서 jwt을 초기화(initialize) 하는 것
#2
jwt = JWTManager()
jwt.init_app(app)
create_access_token(identity="값")
@jwt_required
get_jwt_identity()
token 을 만들어주는 코드이다.
값 부분에는 주로 username, user_id 가 들어가는 것 같다.
end-point 호출을 허용하기 전에 요청자가 유효한 access token을 가지고 있는지 확인한다.
end-point에 액세스하는 JWT의 ID를 반환한다(JWT가 없으면 대신 'None'이 반환된다).
# token 생성
access_token = create_access_token(identity="admin")
# print(current_user) => "admin" 값이 나온다.
current_user = get_jwt_identity()
메소드, 매개변수 등은 아래 링크를 통해 더 많이 볼 수 있다.
https://flask-jwt-extended.readthedocs.io/en/stable/api/