본문 바로가기
IT 프로그래밍 관련/API server ( Flask )

토큰을 통한 유저 인증 , 로그인,아웃관리 ( flask-jwt-extended )

by 지나는행인 2021. 4. 8.
728x90

파이썬의 flask-jwt-extended   라는 라이브러리는 java web token 으로 사용자의 로그인, 로그아웃 기능을 구현하며,

 

그때마다 사용자에게 새로운 토큰을 발행하여, 그 토큰이 권한을 갖게 한다.

 

아래서 만든 레시피 API에서 레시피를 만들어서 추가하려고 하는데 그 부분을 로그인한 회원만 할 수 있도록 설정 할 수

 

있다는 것이다.  ( 토큰은 회원간에도 다 다르기 때문에 사용자 간의 구분이 가능하고, 내 정보보기등에 설정을 해놓으면,

 

내가 가진 토큰과는 맞지 않는, 다른 사람은 나의 정보를 볼 수 없다.)

 

1) 회원가입

 

먼저 jwt를 사용하기 위해서는 시크릿키를 만들어야 하고, jwtmanagerf 를 활성화해야한다.

* 실행하는 페이지에서 환경설정

jwt사용을 위해

JWTManager를 변수에 옮겨닮고, 함수를 적었다.

 

16행 부터 21행까지는 jwt사용 관련 레퍼런스에 나와있는 내용이다.

 

그리고 시크릿키는 , 위의 Config에 업데이트 해두었다.

1
2
3
4
class Config : 
    DEBUG = True
    # JWT용 시크릿키
    SECRET_KEY = 'kyeonghyeon_04_21'
cs

기존 Config 클래스에 넣어두었다. 이렇게 넣어두면 자동으로 시크릿키를 가져가 이용한다.

 

 

회원가입, 로그인, 로그아웃 API 를 보겠다.

먼저 관련 라이브러리를 임포트하고.

1
2
3
4
5
#유저인증위한 JWT라이브러리
from flask_jwt_extended import create_access_token, jwt_required, get_jwt_identity,get_jwt
 
#로그아웃 기능구현
from flask_jwt_extended import get_jti
cs

 

임포트후에는 . 아래의 로그아웃시 적용할 코드도 들어있지만, 주석옆에 내용이 적혀있으니 로그인 하는 코드를 끝까지 보도록 한다.

* 회원가입 API

여기서 토큰 관련으로 봐야할 것은,   데이터베이스에 정보를 저장하고,

 

마지막행의 id 즉 내가 지금 가입한 아이디의 아이디값을 가져오는 코드인

 

cursor.getlastrowid()를 사용해서 변수에 저장하였다.

 

이것을 이용하여 인증토큰을 생성한다.

 

create_access_token 의 identity 값으로 user_id를 설정한다.

 

테이블에서의 id값을 중복되지 않기 때문에 , 단 하나뿐이다. 유니크하다.

 

클라이언트에게 돌려주는 값은 

 

위와 같이 알수 없는 값으로 생성된 토큰을 전달한다.

 

 

 

2) 로그인 API

 

회원정보가 맞다면 로그인시 토큰을 발행하여 , 그 토큰으로 권한을 가지고 작업을 수행할 수 있도록한다.

 

기본적인 코드는 회원가입과 비슷하다 . 토큰발행 코드는 같으며 , 로그인하려는 아이디 비번이, 데이터 베이스에 저장된

 

아이디 비번과 같을때 토큰이 발행되고 , 이때도 역시 토큰값을 클라이언트에게 되돌려준다.

 

 

 

이 토큰을 어떻게 사용하는지에 대해 알아본다.

 

 

3) 레시피 추가 생성

 

위에 이야기했듯이 요리 레시피를 추가하려고 하는데 비회원은 추가할 수 없고 회원만 추가할 수 있다고 가정한다.

 

이러면 사용자 회원인지 , 로그인이 되어있는 상태인지 확인 할 필요가 있다.

 

이때 발행받은 토큰이 사용되는 것이다.

 

로그인시 토큰이 발행되기때문이 이것을 가지고 있으며, 가입하고 로그인 되어 있는 상태라 알 수 있기 때문이다.

 

먼저 사용자가 레시피를 추가하려고 요청을 줄때 토큰 정보를 같이 줘야한다.

 

포스트맨을 예로 들면 , 

위와 같이 POST메소드로 Body부분에 데이터를 보내는 것은 인증 절차가 없을때와 같으나,

 

Headers 부분을 수정해야한다.

 

Headers 클릭하여 설정에서 Authorization을 추가하고 옆에 추가부분에 Bearer 입력후 한칸 띄고

 

받은 토큰을 붙여넣고 그다음 Send를 눌러야 유저인증이 되고,

 

확인 결과 맞다면 요청한 작업이 수행된다.

 

이 부분을 레시피 추가 API 코드화면으로 보면,

 

이러하다.

 

제일 윗단의 @jwt_required()  가 ,  토큰을 받아야 작업을 한다는 뜻이다.

 

다른 작업에도 위와 같은 코드가 있다면, 토큰이 필요하다는 뜻이다.

 

위 코드는 , 포스트맨에서 보내온 토큰을 통해서 , 해당유저의 아이디값을 알아내고 ,

 

요리 레시피 추가를 할 시에 유저의 id를 등록함으로 해당 레시피의 주인을 작성자를 표시한다.

 

이후에 업데이트나 이런것을 할때 이 작성자의 id와  그때 레시피를 업데이트 작성하는 사용자의 토큰과,

 

맞지 않으면 업데이트는 이루어지지 않는다.

 

 

 

4) 로그아웃 

 

로그아웃은 간단하다.

 

위의 설명 화면에 로그아웃 관련 임포트나 코드가 있었지만 여기서 다시 모아보면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#로그아웃 기능구현
from flask_jwt_extended import get_jti
 
jwt_blocklist = set()     ## 로그아웃을 위한.
 
 
class UserLogoutResource(Resource) :
    
    @jwt_required()
    
    def post(selt) :
        
        jti = get_jwt()['jti']
        jwt_blocklist.add(jti)
 
        return {'message' : 'Log Out'},HTTPStatus.OK
cs

이 역시 레퍼런스에 나와있는 로그아웃 활용 방법이며,

 

return 에는 임의로 정한 것이다.

 

 

 

 

이처럼 로그인, 로그아웃, 레시피추가로 예를 들었지만. 

 

JWT 는 현재 실무에서 많이 사용하고 있는 인증 라이브러리로, 여러군데서 활용이 가능하니 , 

 

이런 라이브러리가 있고, 이런 사용법이 있다고 기억하면 좋겠다.

 

댓글