Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- Selection Sorting
- Serialization
- Graph
- Algorithm
- 메모리구조
- stream
- s
- list 컬렉션
- 윤성우 열혈자료구조
- 윤성우의 열혈 자료구조
- 혼자 공부하는 C언어
- buffer
- insertion sort
- 이스케이프 문자
- C programming
- 알기쉬운 알고리즘
- C 언어 코딩 도장
- 이것이 자바다
- datastructure
- coding test
- R
- JSON
- Stack
Archives
- Today
- Total
Engineering Note
JWT 본문
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