Engineering Note

JWT 본문

Server/Flask

JWT

Software Engineer Kim 2021. 7. 18. 21:39

JWT

  • JSON Web Token
  • JWT는 서버와 클라이언트 간의 인증을 도와주는 도구 중의 하나입니다.
  • 서버와 클라이언트의 각각의 역할에 집중할 수 있게 해주는 매개체가 되기도 합니다.
  • 웹 표준(RFC 7592)으로서 두 개체에서 JSON 객체를 사용하여 통합합니다.
    • JSON 포맷을 이용 하여 사용자에 대한 속성을 저장하는 Web Token
    • 토큰 자체를 정보로 사용하는 Self-contained 방식으로 안정하게 전달
  • JWT를 이용한 로그인 토큰 발급서버와 클라이언트의 각각의 역할에 집중할 수 있게 해주는 매개체가 되기도 합니다.JWT를 사용하기 위해서는PyJWT모듈이 필요합니다.jwt.encode와jwt.decode를 적절히 사용해서 사용자에게 로그인 토큰 정보를 주도록 기능을 작성해 보겠습니다.
  • 암호화를 위해서는jwt.encode()를 사용하고, 암호화 해독을 위해서는jwt.decode()가 필요합니다.
  • 유저는 인증을 받아야 하고, 서버는 그 인증을 보고 확인을 해주는 역할을 수행 하는 데에 집중하게 해 줍니다.
    세션 관리를 하지 않고 JWT로 인증을 수행 하므로 더는 인증을 위한 세션을 관리하면서 서버의 리소스를 낭비하지 않아도 됩니다.
  • JWT는 서버와 클라이언트 간의 인증을 도와주는 도구 중의 하나입니다

JWT의 생김새

  • Header에는 토큰의 타입과 알고리즘을 저장합니다.
    • 토큰의 헤더는 총, 두 가지 정보(typ와 alg)로 구성됩니다. typ는 토큰의 타입을, lag는 알고리즘 방식을 지정
  • Payload에는 토큰에 담을 정보를 넣습니다.
    • 토큰에서 사용할 정보의 조각들인 클레임이 담겨 있습니다. 클레임은 총 3가지(registered, public, private)로 나누어지며, JSON 형태로 다수의 정소를 넣을 수 있습니다.
    • registered는 등록된 클레임 - 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터 입니다.
  • Signateure에는 헤어와 정보의 인코딩 값들과 관련된 비밀키가 들어있습니다.

JWT 구조

  • JSON 형태인 각 부분은 Bse64로 인코딩되어 표현됩니다.
  • header, payload, signature, 각 부분은. 구분자를 사용하여 구분합니다.

실습 코드

from flask import Flask, request, render_template, jsonify
# jwt 모듈을 import하세요.
import jwt

app = Flask(__name__)
encryption_secret = "secret_elice"
algorithm = "HS256"

origin = {"name":"elice", "password":"elice@1234"}


@app.route("/", methods=["GET","POST"])
def jwt_route():
    # 조건문을 이용해 API 요청을 구분하세요.
    method = request.method
    if method == "POST":
        # POST 방식으로 전송된 username과 password를 변수에 저장하세요.
        id = request.form['username']
        pw = request.form['password']

        # origin에 저장된 name, password와 비교하세요.
        if origin['name'] == id and origin['password'] == pw:
            # 정보가 일치하는 경우 사용자 변수를 만들기 위한 dictionary를 선언하세요.
            data_to_encode = {'name':id, 'password':pw}
            # 인증이 완료되면 전송할 encode, decode 정보를 저장하세요.
            encoded = jwt.encode(data_to_encode, encryption_secret, algorithm = algorithm).decode()
            decoded = jwt.decode(encoded, encryption_secret, algorithm = [algorithm])

            # 저장한 정보를 json 형태로 전송하세요.
            data = {"encoded":encoded, "decoded":decoded}

            return jsonify(data)

        # 정보가 일치하지 않는 경우 "User Not Found"를 화면에 출력하세요.
        else:
            return jsonify("User Not Found")
    else:
        return render_template("index.html")



if __name__ == "__main__":
    app.run(debug = True)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=<device-width>, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <form action="/" method='post'>
        <p>
            ID : <input id='username' name='username' type="text">
        </p>
        <p>
            PW : <input id='password' name='password' type="password">
        </p>
        <button type="submit">전송</button>
    </form>
</body>

</html>

'Server > Flask' 카테고리의 다른 글

Flask 공식 튜토리얼 게시판 만들기  (0) 2021.07.20
SQL Alchemy와 ORM  (0) 2021.07.18
RDB와 Flask  (0) 2021.07.18
Flask 게시글 삭제  (0) 2021.07.18
Web-Backend 2  (0) 2021.07.18
Comments