aaaaaa.bbbbbb.cccccc
a > 헤더(header) : 암호화 할 방식, 타입
b > 내용(payload) : 사용자의 아이디, 유효 기간
c > 서명(signature)
🚨 토큰은 header, payload, secret key를 합쳐 생성된다.
1) login 요청
2) 서버에서 JWT 발급
3) 발급한 JWT를 브라우저로 보냄
4) 이후 요청이 들어올 시 발급받은 JWT를 함께 보냄
5) 서버에서 JWT에 포함된 signature을 확인하여 JWT로부터 유저 정보를 얻음
6) response를 보냄
토큰을 보내기 위해서는 local storage나 쿠키, httpOnly에 가지고 있어야 하는데 local storage는 JS로 쉽게 접근할 수 있어 보안에 취약하다고 한다.
이번 프로젝트에서는 쿠기에 담아보기로!
# 로그인
@app.route('/', methods=['GET', 'POST'])
def login():
if request.method == "GET":
return render_template('login.html')
else:
id_receive = request.form['id']
pw_receive = request.form['pw']
#해시 함수 아래에 정리!
pw_hash = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest()
#db저장
result = db.members.find_one({'id': id_receive, 'pw': pw_hash})
if result is not None:
#내용
payload = {
'id': id_receive,
#유효기간
'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')
return jsonify({'result': 'success', 'token': token, 'msg': '로그인 성공!'})
else:
return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
function login() {
let id = $('#id').val()
let pw = $('#pw').val()
$.ajax({
type: "POST",
url: "/",
data: {
id: id,
pw: pw
},
success: function (response) {
if (response['result'] == 'success') {
$.cookie('mytoken', response['token'], {path: '/'});
window.location.replace("/home")
alert(response['msg'])
} else if (id === '' || pw === '') {
alert('아이디 또는 비밀번호를 입력해주세요')
} else {
alert(response['msg'])
}
}
})
}