인스타 UI 클론 진행중이다. 벌써 한주가 다되어 가는데 이제 내일까지만 프로젝트를 하면 수요일날 발표이다
오늘 오전시간은 어제 구현한 jwt 토큰을 이용한 로그인 코드를 조금 정리하였고 꺠지는 css나 전체적인 코드를 조금씩 정리를 해보았다.
우선 세션으로 하던 로그인 방식을 쿠키를 이용한 방식으로 바꾸었다. 어제 이 작업을 하다가 조금 애를 먹었는데 그래도 우선 구현은 성공적으로 하였다!.
타임어택테스트 에서 거의 구현을 못했던 방식이라 개인적으로도 도전해보고 싶었다.
<button class="login_btn" id="login">로그인</button>
onclick 을 통해서 login 함수를 호출한다
function login() {
let uid = $('#uid').val()
let pwd = $('#pwd').val()
$.ajax({
type: "POST",
url: "/login_check",
data: {uid_give:uid, pwd_give:pwd},
success: function (response) {
if (response['result'] == 'success') {
$.cookie('mytoken', response['token'], {path:'/'});
window.location.href = '/'
} else {
}
},
});
}
@app.route('/')
def home():
token_receive = request.cookies.get('mytoken')
try:
payload = jwt.decode(token_receive, SECRET_KEY, algorithms=['HS256'])
user_info = db.user.find_one({"uid": payload['uid']})
print(user_info['uid'])
print(user_info['name'])
return render_template('feed.html')
except jwt.ExpiredSignatureError:
return redirect(url_for("login"))
except jwt.exceptions.DecodeError:
return redirect(url_for("login"))
@app.route('/login_check', methods=['POST'])
def login_check():
uid_receive = request.form['uid_give']
pwd_receive = request.form['pwd_give']
pwd_hash = hashlib.sha256(pwd_receive.encode('utf-8')).hexdigest()
result = db.user.find_one({
'uid': uid_receive,
'pwd': pwd_hash
})
if result is not None:
payload = {
'uid': uid_receive,
'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=10)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
print("token =", end=""), print(token)
return jsonify({'result': 'success', 'token': token})
else:
return jsonify({'result': 'fail', 'msg': 'wrong'})
어찌어찌 구현을 하긴 했지만, 솔직히 100% 이해가 가진 않는다. 조금은 헷갈리는 부분도 있기도 하고 내가 이해한 방식이 맞나 싶기도 하지만, 계속 구글링을 통해서 어떤 방식으로 진행이 되는지 이해할 예정이다. 역시 공부가 더 필요한 부분인 것 같다.
function logout() {
$.removeCookie('mytoken', {path: '/'});
window.location.href = '/login';
}
로그아웃은 간단하게 구현이 가능하다. 쿠키값만 삭제해 주면 된다.
처음에 로그아웃 기능이 잘 먹히지 않아 여러 구글링을 해보았지만, jwt토근의 값은 변경하기가 어렵다고 한다
그래서 토큰의 유효시간을 이용해 하는 방법도 있고, 여러방법이 있다고 하지만 코드가 많이 복잡해 진다고 한다.
적용이 안됬던 원인도 함수호출의 오루였던 것 같다.
JWT 인증 방식은 두고두고 쓰일 거라 지금 이해가지않으셔도 꾸준히 학습하시면 좋을 것 같습니다!