JWT 토큰

이진석·2022년 9월 25일
0

JWT Token을 사용한 로그인 기능

JWT란??

JSON Web Token의 줄임말, JSON 객체를 사용해 정보를 안정성 있게 전달하는 웹 표준이다.

JWT의 토큰 구성을 보면 세개의 파트로 나누어지는데 header, payload, signature로 구성되며 각 파트는 .으로 구분하여 xxxxxx.yyyyyy.zzzzzz 처럼 표현된다.

header는 토큰의 타입과 해시 암호화 알고리즘으로 구성되어 있고 payload는 토큰에 담을 클레임 정보를 포함하고 있다. 마지막으로 signature에는 secret key를 포함하여 암호화 되어 있다.

JWT Process

  1. 사용자가 id, password를 입력하여 로그인을 시도
  2. 서버는 요청을 확인하고 secret key를 통해 Access Token 발급
  3. JWT 토큰을 클라이언트에 전달
  4. 클라이언트에서 API 요청할 떄 Authorization heade에 Access Token을 담아서 보냄
  5. 서버는 jwt의 signature를 체크하고 payload로부터 사용자 정보를 확인해 데이터를 반환

JWT 장점과 단점

장점

  • 가장 큰 장점은 사용자 인증에 필요한 모든 정보를 토큰 자체에 포함하기 때문에 별도의 저장소가 필요 없다는 것
  • 분산 마이크로 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 방식 및 인가 방법을 제공(정보가 토큰에 담겨 있기 때문에)

단점

  • 토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없음
  • 더 많은 필드가 추가되면 토큰이 커질 수 있음
  • 비상태 어플리케이션에서 토큰은 거의 모든 요청에 대해 전송되므로 많은 트래픽을 유발할 수 있음
@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 데이터, 해쉬 알고리즘을 통해
토큰을 만들어서 리턴해준다.

profile
고양이 두마리의 집사이자 행복 코딩을 추구하는 주니어 개발자입니다!

0개의 댓글