로그인을 하고 로그인 상태인지를 확인하기 위해 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);
});
}
@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") 이렇게 해더에서 찾게 만들 수 도 있다.