로그인에 필요한 JWT 토큰

김민웅·2021년 7월 13일
0

로그인을 하고 로그인 상태인지를 확인하기 위해 JWT토큰을 발급한다.
Access_token 과 Refresh_token 2가지를 발급한다.

Access_token은 토큰 만료기간이 짧고 json 형식으로 전달해줄 수 있다.
Refresh_token은 보여지지 않아야하기 때문에 쿠키에 넣어서 전달해야한다고 적혀있었다.

JWT_COOKIE_SECURE = False # https를 통해서만 cookie가 갈 수 있는지 (production 에선 True)
app.config["JWT_TOKEN_LOCATION"] = ['cookies', "headers", "json"] #토큰을 어디서 찾을지에 대한 내용
JWT_COOKIE_CSRF_PROTECT = True 
JWT_ACCESS_TOKEN_EXPIRES = 12000 - #2분

로그인 시 토큰 발급

@app.route('/api/login', methods=['POST'])
def login():
    userform = request.json
    UserLogin = views.user_login(userform['userID'], userform['password'])
    
    if UserLogin == True:
        access_token = create_access_token(identity=userform['userID'])
        refresh_token = create_refresh_token(identity=userform['userID'])

        resp = jsonify(Result = 'success', access_expire = JWT_ACCESS_TOKEN_EXPIRES, access_token = create_access_token(identity = userform['userID']))
        #set_access_cookies(resp, access_token)
        set_refresh_cookies(resp, refresh_token)
        return resp, 200

Access_token 의 기간이 만료되면 Refresh_token을 가지고 Access_token을 재발급 받아야 한다.
그래서 토큰 시간이 만료되기 전에 프런트에서 refresh 요청을 보낸다

  const onLoginSuccess = res =>{ //access Token을 localStorage나 cookie에 저장하지 않음(보안상 문제 노션링크참조)

    const accessToken = res.data.access_token; // 이거 
    const accessExpire = res.data.access_expire;
    

    console.log(accessExpire)
    //accessToken default로 설정 
    axios.defaults.headers.common['Authorization']= `Bearer ${accessToken}`;

    //accessToken만료시 timeout되는데... 그거 refresh하는 함수만들어야하는데 아직 이따가.. 
    setTimeout(onSilentRefresh, `${accessExpire}`-60000); 
    //만료일분 전에 로그인 연장
  }
  
    const onSilentRefresh = () => {

    axios.get('/api/refresh')
        .then((res)=>{
          console.log(res)
          console.log("정상적으로 refresh 완료")
          onLoginSuccess(res)
        })
        .catch((err) => {
          //Hide Loader
          console.error(err);
        });
  }

/api/refresh/로 GET요청

@app.route('/api/refresh', methods=['GET'])
@jwt_required(refresh=True) --- #@jwt_required(locations="headers")
def refresh():
    current_user = get_jwt_identity()
    access_token = create_access_token(identity=current_user)
    return jsonify(access_token=access_token, current_user=current_user, access_expire = JWT_ACCESS_TOKEN_EXPIRES)

GET 요청이 들어오면 @jwt_required(refresh=true)로 refrest 토큰이 있는지 확인한다. refresh 토큰은 쿠기에있고 쿠키는 해더에 있기에 위에서 app.config["JWT_TOKEN_LOCATION"] = ['cookies', "headers", "json"] 에 해더를 포함해야한다.
아니면 @jwt_required(locations="headers") 이렇게 해더에서 찾게 만들 수 도 있다.

0개의 댓글