session 객체
플라스크가 각각의 클라이언트 요청에 대해 고유한 request 객체를 만드는 것과 같이 session 객체 역시 각 요청에 대해 고유하게 생성됩니다.
session 객체는 딕셔너리와 비슷하며, 플라스크가 사용자 측의 쿠키에 직렬화합니다.
세션에 포함된 데이터는 JSON 형태로 나타나며, zlib를 사용해서 압축되고 최종적으로 base64로 인코딩 됩니다.
세션이 직렬화될 때는 itsdangerous 라이브러리가 애플리케이션 레벨에 정의된 secret_key 값을 사용해 컨테츠를 서명합니다. 서명에는 HMAC과 SHA1를 사용합니다.
이 서명은 데이터에 접미사로 추가되며, 데이터에 서명된 비밀 키를 알지 못하면 클라이언트가 쿠키에 저장된 데이터를 변조할 수 없게 합니다. 데이터 자체는 암호화되지 않습니다.
플라스크는 서명 알고리즘을 수정할 수 있지만, HMAC+SHA1은 데이터를 쿠키에 저장할 경우에는 충분히 좋습니다.
HTML을 생성하지 않는 마이크로서비스에서는 쿠키가 드물게 사용됩니다. 쿠키는 웹 브라우저에만 해당되기 때문입니다. 하지만 각 사용자별로 임시적인 키-값 저장소를 유지한다는 아이디어는 서버 측 작업 속도를 높일 수 있기 때문에 유용하게 쓸 수 있습니다.
예를 들어 사용자가 접속할 때마다 데이터베이스에서 사용자 정보를 찾아야 한다면 이 정보를 서버 측의 session 객체에 캐시해두면 좋습니다.
session 저장 및 불러오기 예시
flask session을 사용하기 위해 flask-session 모듈을 설치합니다.
pip install Flask-Session
간단하게 username을 등록하고 등록된 username을 확인하고 삭제하여 보겠습니다.
우선 app.py를 다음과 같이 작성합니다.
from flask import Flask, session, jsonify, escape
app = Flask(__name__)
app.secret_key = "ABCD"
@app.route("/")
def index():
if "username" in session:
# 세션이 있는 경우
return jsonify("You are {}".format(escape(session["username"])))
else:
# 세션이 없는 경우
return jsonify("Who are you??")
@app.route('/set/<value>')
def set(value):
# set url의 value를 username으로 등록
print(value)
session["username"] = value
return jsonify("userName is {}".format(value))
@app.route('/clear')
def get():
# 세션 삭제
session.pop('username', None)
return jsonify("Now No Session..")
- 위의 애플리케이션 실행 후 브라우저를 이용하여 localhost:5000 에 접속합니다.
- 그 후 localhost:5000/set/<이름> 을 통하여 세션에 유저 이름을 등록합니다.
- localhost:5000 에 다시 접속하면 세션에 username이 저장되어있기 때문에 다음과 같이 나타납니다.
- localhost:5000/clear 에 요청을 보내면 세션을 삭제합니다.
- 이 후 다시 localhost:5000/ 에 접속하면 세션이 삭제된 것을 확인할 수 있습니다.
Flask의 session 객체에 대하여 다루어보았습니다.
다음 도서를 참고하였습니다.
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=191830482
다음 사이트를 참고하였습니다,
https://flask.palletsprojects.com/en/2.0.x/quickstart/#sessions
'About > Flask' 카테고리의 다른 글
[Python] Flask Signal (Blinker) (0) | 2021.09.25 |
---|---|
[Python] Flask 전역 공간 (Flask.g) (0) | 2021.09.25 |
[Python] Flask url_for 함수 (0) | 2021.09.05 |
[Python] Flask 변수와 컨버터 (0) | 2021.09.05 |
[Python] boto3를 이용한 Flask-S3 연동 (파일 업로드 및 다운로드) (1) | 2021.07.19 |