본문 바로가기

BackEnd/Python-Flask

[백엔드] Flask: JWT token으로 코드 짜기

반응형

JWT token으로 코드 짜기 

 

  • 미리 postman에 가서 세팅해둔다:
  • 실행할 API의 header의 Key값을 Authorization로 설정한다.  

  • 여러 토큰의 형식 중에 하나인 Bearer을 Value에 입력해준다.
  • -> Bearer 띄어쓰기 하고, 로그인 할 때의 access token을 입력한다.
  • access token: user_id의 정보가 들어있는 것. 그것을 암호화 하여 전송하는 것.
  •  -> access token이 있어야 누가 API를 요청하는지 알수 있다.

 

  • 우선 사용될 라이브러리는 하기와 같으며,
from http import HTTPStatus
from flask import request
from flask_jwt_extended import get_jwt_identity, jwt_required
from flask_restful import Resource
from mysql.connector.errors import Error
from mysql_connection import get_connection
import mysql.connector
from mysql_connection import get_connection
  • 코드는 하기와 같다.
더보기
class RecipeListResource(Resource):

    @ jwt_required()
    # 무조건 header부분에 Authorization의 키 값이 있어야한다.

    def post(self):
        data = request.get_json()

       user_id= get_jwt_identity()

        try:
            # 데이터 insert
            # 1. DB에 연결
            connection = get_connection()

            # 2. 쿼리문 만들기
            query = '''insert into recipe
                    (name, description, cook_time, directions, user_id)
                    values
                    (%s,%s,%s,%s,%s);'''
            record = (data['name'],data['description'], data['cook_time'],data['directions'], user_id )

            # 3. 커서를 가져온다.
            cursor = connection.cursor()

            # 4. 쿼리문을 커서를 이용해서 실행한다.
            cursor.execute(query,record)

            # 5. 커넥션을 커밋해줘야 한다 => 디비에 영구적으로 반영하라는 뜻
            connection.commit()

            # 6. 자원 해제
            cursor.close()
            connection.close()

        except Error as e:
            print(e)
            cursor.close()
            connection.close()
            return {"error": str(e)}, 503

        return {"result":"success"},200

사용법: 

  • 함수 정의하기 전에 적어준다. 
  • jwt_required 역할: 해당 API를 호출하려면, header의 Bearer 뒤에 있는access token하고 같은지 확인하라는 뜻. 

 

  • 그리고 user_id를 받아와야한다. 로그인/회원가입 할 때도 user_id 필요.
  • 그리고, 그 user_id를 가지고 access token이 생성된 것.
get_jwt_identity()
  • token으로부터 user_id를 다시 받아온다..  
  • 이 user_id를 가지고, 밑 쿼리에 user_id 변수명을 입력한다..
  • header부분에 토큰이 없으면 서버가 요청 처리를 안해준다. 

  • user_id란을 추가하였음.
  • 요청할 때도 전달하고, 회원/로그인할 때 서버에서 전달받고, 유저 로그인 API 데이터 호출 할 때, 같이 호출해줘야한다. 근데 아이러니하게도 이부분이 해킹의 위험이 가장 높은 부분이다. 

  • postman에 가서 테스트를 해본다.

 

  • 잘 동작하는지 확인 했으면, mysql workbench에 가서 확인한다.

user_id가 각기 다른 것을 확인할 수 있다.

 

  • header에 token이 없을 시 >>
  • header에서 체크를 해제해고 요청을 보내면, 에러가 난다. 

 

반응형