JSON Web Token의 줄임말, JSON 객체를 사용해 정보를 안정성 있게 전달하는 웹 표준이다.
JWT의 토큰 구성을 보면 세개의 파트로 나누어지는데 header, payload, signature로 구성되며 각 파트는 .으로 구분하여 xxxxxx.yyyyyy.zzzzzz 처럼 표현된다.
header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있고 payload는 토큰에 담을 클레임 정보를 포함하고 있다. 마지막으로 signature에는 secret key를 포함하여 암호화 되어 있다.
장점
- 가장 큰 장점은 사용자 인증에 필요한 모든 정보를 토큰 자체에 포함하기 때문에 별도의 저장소가 필요 없다는 것
- 분산 마이크로 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 방식 및 인가 방법을 제공(정보가 토큰에 담겨 있기 때문에)
단점
- 토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없음
- 더 많은 필드가 추가되면 토큰이 커질 수 있음
- 비상태 어플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 많은 트래픽을 유발할 수 있음
@app.route('/login/api', methods=['POST'])
def api_login():
id_receive = request.form['id_give']
pw_receive = request.form['pw_give']
pw_hash = hashlib.sha256(pw_receive.encode('utf-8')).hexdigest()
result = db.user.find_one({'id': id_receive, 'pw': pw_hash})
if result is not None:
payload = {
'id': id_receive,
'exp': datetime.utcnow() + timedelta(seconds=60*60*1)
}
token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')
return jsonify({'result': 'success', 'token': token})
else:
return jsonify({'result': 'fail', 'msg': '아이디/비밀번호가 일치하지 않습니다.'})
flask에서 JWT를 사용한 로그인을 구현해본 코드로 로그인 요청이 들어오면 payload에 id와 만료 시간을 담은 다음 미리 지정한 secret key와 payload 데이터, 해쉬 알고리즘을 통해
토큰을 만들어서 리턴해준다.