μ? JWT ν ν°μ μ΄μ©ν΄μ λ‘κ·ΈμΈ/μΈμ¦μ ν΄μΌνλ κ±ΈκΉ?
κΈ°μ‘΄ μΈμ¦ μμ€ν
μ μλ²μΈ‘μμ μ μ μ μ 보λ₯Ό κΈ°μ΅νκ³ μμ΄μΌ νλ€. κ·Έλμ μ΄ μΈμ
μ μ μ§νκΈ° μν΄μλ λ©λͺ¨λ¦¬/λμ€ν¬/dbμ μ΄κ±Έ λ΄μμ΄μΌνλ€.
μ΄λ°μμΌλ‘! κ·Όλ° μ΄κ² μμ’μκ² μ μ κ° μΈμ¦ν λ μλ²λ κ·ΈλΌ μ΄ κΈ°λ‘μ μλ²μ μ μ₯μ ν΄μΌνλ€. μ΄κ² μΈμ
λ°©μ. κ·Όλ° ν λλͺ
λ μλκ³ λͺ λ°±λ§λͺ
μ κΈ°λ‘μ μ μ₯ν΄μΌ νλ€λ©΄ μλ²κ° ν°μ§κ² μ§? λ¬Όλ‘ dbμ μ μ₯ν μλ μμ§λ§ db μ±λ₯μλ λ¬΄λ¦¬κ° κ° μ μμΌλ.
μΈμ
μ μ¬μ©νλ©΄ μλ²λ₯Ό νμ₯νλ κ²λ μ΄λ €μμ§λ κ². νΈλν½λ λ§μμ§κ³ μ΄λ°μ λ° μ΄λ €μλ€.
κ·Έλμ ν ν° κΈ°λ°μ JWTλ₯Ό μ¬μ©νλ€. κ·ΈλΌ μ΄ JWTλ κΈ°μ‘΄μ λ°©λ²μ 보μνλ μ©λλ‘ μ¬μ©μ΄ λ κ²μ΄λ€.
μΏ ν€μ μΈμ , JWT μΈκ°μ§ λΉκ΅
- λλΆλΆμ μΉμ μΏ ν€μ μΈμ μ μ΄μ©ν μΈμ¦ λ°©μμ ν΅ν΄ λ‘κ·ΈμΈ κΈ°λ₯μ ꡬν
- μ¬μ©μκ° μλ²μ μ¬λ°λ₯Έ μμ΄λμ ν¨μ€μλλ₯Ό μ λ¬νλ©΄, μλ²μμ μΈμ¦ μ μ°¨λ₯Ό κ±°μΉ ν, ν΄λΉ μΈμ κ°μ μλ² λ΄μ μμ±νλ€. μμ±ν μΈμ μ λ°νμΌλ‘ μΈμ IDλ₯Ό μμ±νμ¬ ν΄λΌμ΄μΈνΈμκ² λ겨주λλ°, μ¬μ©μμ λΈλΌμ°μ λ μ΄κ²μ μΏ ν€μ μ μ₯νμ¬, μΈμ¦μ μμ²ν λλ§λ€ ν΄λΉ μΏ ν€λ₯Ό 보λμΌλ‘μ¨ λ‘κ·ΈμΈ μΈμ¦μ μν
- μΈμ κΈ°λ° μΈμ¦μ λνμ μΈ λ¨μ μ λ°λ‘ "μλ²"μμ μΈμ μ 보λ₯Ό μ μ₯νκ³ μλ€λ κ².
-> λΈλΌμ°μ λ₯Ό λλλΌλ λ€μ μ μν κ²½μ°, λ‘κ·ΈμΈμ΄ μ μ§λμ΄ μλ 컨μ μ΄ μ ννλ©΄μ μΈμ μ μ₯μμ μ μ₯λ μ 보 = νμ μμ λΉλ‘νκ² λμκ³ μ μ μλ²κ° κ΄λ¦¬νλ μ 보μ μμ΄ λμ΄λκ² λ κ². μ¦, μλ²κ° μΈμ μ μ₯μλ₯Ό μ¬μ©νλ―λ‘ μμ²μ΄ λ§μ κ²½μ° μλ²μ λΆνκ° λμ΄λλ€.- JWTλ μ΄λ¬ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° λμ λ ν΄λΌμ΄μΈνΈ κΈ°λ°μ μΈμ¦ λ°©μ
- μλ μλ²μ μ μ₯ν΄μΌ ν μΈμ κ°μ κ·Έλ₯ κ° μ¬μ©μμκ² λͺ¨λ λ겨λ²λ¦¬μλ κ²μ΄λ€. κ·Έλ¦¬κ³ μΈμ¦ μμ ν΄λΉ ν ν°μ μ ν¨μ±μ κ²μ¦ν λͺ¨λ νλλ§ μμΌλ©΄ μ΄κ² μμ²΄κ° μΈμ μ μ₯μ μ 체λ₯Ό λ체νλ μλ¨μ΄ λλ κ²μ΄λ€.
- JWTλ μ¬μ©μμ κ³ μ μ±μ μ μ¦ν λ§ν λ°μ΄ν°λ₯Ό ν¬μ₯νμ¬ ν ν°μ μμ±νλ€. κ·Έλ¦¬κ³ ν΄λΉ ν ν°μ ν΄λΌμ΄μΈνΈμκ² μ μ‘λ°μμ λ, ν΄λΉ ν ν°μμ λ€μ΄μλ κ³ μ λ°μ΄ν°λ‘ μ¬μ©μλ₯Ό μλ³νμ¬, λ³λμ μΈμ¦ κ³Όμ μμ΄ λ°λ‘ μμ μ μνν μ μκ² λλ€.
- λ¨, ν΄λΉ ν ν°μ ν΄λΌμ΄μΈνΈμ μ μ₯λλ€λ μ μ 보μμ΄ μ·¨μ½ν μ°λ €κ° μκΈ° λλ¬Έμ μ¬μ©μμ λν λ―Όκ°ν μ 보λ₯Ό μ μ₯νλ κ²μ κΆμ₯νμ§ μλλ€κ³ νλ€.
π₯ μμ μ μ 리ν΄λλ jwtλ₯Ό μ°Έκ³ ν΄μ λ€μ μ½μ΄λ³΄κΈ°!: https://velog.io/@majaeh43/JWT
from flask import Flask
from flask_jwt_extended import *
application = Flask(import_name = __name__)
application.config.update(
DEBUG = True,
JWT_SECRET_KEY = "get some sleep"
)
# # ν ν° μμ±μ μ¬μ©λ Secret Keyλ₯Ό flask νκ²½ λ³μμ λ±λ‘
jwt = JWTManager(application)
@application.route("/")
def test1():
return "<h2>hola, soy Ria!<h2>"
if __name__ == '__main__':
application.run(port = 5000,
debug = True)
from flask_jwt_extended import JWTManager
application.config.update(
DEBUG = True,
JWT_SECRET_KEY = "get some sleep"
)
jwt = JWTManager(application)
π λ°λ~
π€ μ°μ΅μ΄λκΉ-
admin_id = "1234"
admin_pw = "qwer"
μλ κ²λ§ μ ν΄μ£Όκ³ !
@application.route("/login", methods=['POST'])
def login_proc():
input_data = request.get_json()
# λ€μ΄μ€λ κ° jsonννλ‘ λ³νν΄μ input_data λ³μμ λ£μ΄μ€κ±°μΌ
user_id = input_data['id']
user_pw = input_data['pw']
if (user_id == admin_id and \
user_pw == admin_pw):
return jsonify(
result = "success",
# ok λ©΄ ν ν° λ°ν!
access_token = create_access_token(identity=user_id,
expires_delta = False)
)
return jsonify(
result = "Invalid Params!"
# μλ, λΉλ² μΌμΉ μνλ©΄~~~
)
if __name__ == '__main__':
application.run(port = 5000,
debug = True)
μΈμ¦μ΄ μ±κ³΅νκ³ μ¬μ©μμκ² ν ν°μ λ°νν΄μ£ΌκΈ° μν΄ create_access_token() ν¨μλ₯Ό μ¬μ©. ν΄λΉ ν¨μμ μ λ ₯λλ μΈμλ λ€μκ³Ό κ°λ€.
"identity": ν΄λΉ ν ν°μ κ³ μ μ±μ μλ³νκΈ° μν μ 보 (μλ²λ ν΄λΉ ν ν°μ μμ²λ°μ ν, ν ν° λ΄μ μλ μ΄ identityκ°μ ν΅ν΄ μ¬μ©μλ₯Ό μλ³νκΈ° λλ¬Έμ κ³ μ ν κ°μ΄ νμνλ€. λ¨, ν΄λΌμ΄μΈνΈ λ¨μμ κ³μ μ μ§λλ μ 보μ΄κΈ° λλ¬Έμ λΉλ°λ²νΈλ₯Ό λΉλ‘―ν μ€μ κ°μΈμ 보λ identityλ‘ μ§μ νλ κ²μ μ§μν΄μΌ ν¨.
"expires_delta": ν΄λΉ ν ν°μ λ§λ£μΌμ (ν ν°μ΄ μ ν¨νκ² μ¬μ©λ μ μλ λ§λ£κΈ°κ°μ μ€μ ν μ μμ!)
κΈ°λΆμ’μ..π
@application.route('/user_only', methods=["GET"])
@jwt_required
def user_only():
cur_user = get_jwt_identity()
if cur_user is None:
return "User Only!"
else:
return "Hi," + cur_user
JWT μ μ© λ°μ½λ μ΄ν° μ½μ
flaskλ ν¨μ μμ route() λ°μ½λ μ΄ν°λ₯Ό μμμ€μΌλ‘μ¨ ν΄λΉ ν¨μλ₯Ό api ν¨μλ‘ λ±λ‘. νμ μ μ© apiλ λ°λ‘ κ·Έμλμ @jwt_required λ°μ½λ μ΄ν°λ₯Ό μΆκ°νμ¬ λ±λ‘
νλ€. ν΄λΉ apiλ λ°λμ ν ν°μ΄ μ
λ ₯
λμ΄μΌ νλ©°, ν ν°μ΄ μ
λ ₯λμ§ μκ±°λ μ ν¨ν ν ν°μ΄ μλλΌλ©΄ μμ ν겨λ²λ¦¬κ±°λ, μ μ ν λμ²κ° κ°λ₯νλ€!!
JWT ν ν° λ΄μ identity κ° λΆλ¬μ€κΈ°
cur_user = get_jwt_identity()
μμ²κ³Ό ν¨κ» μ μ‘λ ν ν°μ νμΈνλ μ½λμ΄λ€. ν΄λΉ ν¨μλ₯Ό μ€ννλ©΄ ν ν° λ΄μ μ΄μ μ ν ν°μ λ°ννμ λ μ μ₯νμλ 'identity" κ°μ κ°μ Έμ¬ μ μλ€.
μ μ΄μ ν ν°μ΄ μμ κ²½μ°, μ μ΄μ ν΄λΉ ν¨μμ λ€μ΄μ¬ μμ‘°μ°¨ μμ§λ§ ν ν° κ°μ΄ μλͺ»λ κ²½μ°, κ°νΉ ν¨μ μμΌλ‘ λ€μ΄μ¬ μ μλ€. λλ¬Έμ ν΄λΉ identity κ°μ κΈ°λ°μΌλ‘ μλμ²λΌ μ ν¨ν ν ν°μ ꡬλΆνλ μ½λλ₯Ό μμ±ν΄μ€ νμκ° μλ€.
ν ν°μ κ°μ΄ μλͺ»λ κ²½μ° "User Only!"λΌλ λ¬Έμμ΄μ λ°ννκ³ , μ±κ³΅ν κ²½μ°, ν΄λΉ μ μ μ id κ°μ λ°ν!
if cur_user is None:
return "User Only!"
else:
return "Hi!," + cur_user
# TypeError: jwt_required.<locals>.wrapper() missing 1 required positional argument: 'fn'
# κ³μ μ΄ μλ¬κ° λλλ° μ΄λκ° λ¬Έμ μΌκΉ. λ°μ½λ μ΄ν°μμ μΈμνλκ° μλ€μ΄κ°λ¨ μ리μΈκ°? μ....
μΆμ²1: https://tansfil.tistory.com/58
μΆμ²2: https://blog.naver.com/shino1025/221568544633
μΆμ²3: https://velopert.com/2350