파이썬 이것저것/파이썬 백엔드

[Python] Flask 세션과 쿠키

agingcurve 2024. 7. 21. 12:36
반응형

세션 과 쿠키
웹 애플리케이션에 상태를 관리하는 두 가지 주요기술은 session과 쿠키임
웹은 기본적으로 상태를 유지않는(stateless) 특성이 있는데, 이는 웹서버가 클라이언트의 요청 사이의 상태 정보를
저장하지 않는다는 것을 의미함 웹페이지를 이동할 때 마다 사용자가 누구인지, 어떤 작업을 햇는지 등의 정보를 매번 인식
세션과 쿠키는 상태를 유지하지 않는 웹의 한계를 극복하기 위해 사용됨

 

세션 : 세션은 서버 측에서 사용자의 상태 정보를 유지, 사용자가 웹 애플리케이션에 로그인 하면, 서버는 고유한 세션 ID를
생성하고, 이를 쿠키로 클라이언트에 전송한다. 클라이언트는 이 세션 ID를 가진 쿠키를 사용해 이후 요청에서 자신을 인증하고 서버는 이 ID를 사용해 사용자의 세션 데이터에 접근한다. 세션 데이터는 로그인 정보, 사용자의 권한, 구매한 상품 목록과 같이 비교적 민감한 정보를 포함한다.

 

쿠키 : 쿠키는 클라이언트 측에서 관리되는 작은 데이터 조각임, 웹 서버는 HTTP 응답을 통해 클라이언트에 쿠키를 전송하고 이후 클라이언트는 동일한 서버에 HTTP요청을 할 때마다, 쿠키를 함께 전송한다. 쿠키는 주로 사용자의 선호도, 세션 식별, 트래킹 정보 등을 저장하는데 사용됨

 

Flask에서 세션 구현

from flask import Flask, session, abort
app = Flask(__name__)

app.secret_key = "your_secret_key"

# 세션 데이터 설정 라우트
@app.route('/set_session')
def set_session():
    session['username'] = "John"
    return '세션에 사용자 이름이 설정 됫습니다'

# 세션 데이터 가져오기 라우트
@app.route('/get_session')
def get_session():
    username = session.get('username')
    if username:
        return f'사용자 이름 : {username}'
    else:
        return '사용자 이름이 세션에 설정 x'
    
@app.route('/protected')
def protected():
    # 세션에 'username'이 설정되어 있찌 않으면 403 에러
    if 'username' not in session:
        abort(403)
        return '이 페이지 는 로그인한 사용자만 볼 수 있습니다.'
    else:
        return '로그인 된 페이지입니다!'

 

session 객체 사용법

1.세션 데이터 저장
session['user_id'] = 42
 - 사용자의 ID를 세션에 저장, 이 ID는 로그인 시 할당된 고윳값

2. 세션 데이터 조회
user_id = session.get('user_id')
 - 세션에서 user_id를 조회, user_id가 없으면 Nonde 를 반환

3. 세션 데이터 삭제
session.pop('user_id' , None)
 - user_id 키를 가진 세션 데이터를 삭제, 두 번째 인자는 키가 존재하는 값

4. 세션 데이터의 존재 여부 확인
is_logged_in = 'user_id' in session
 - user_id 키가 세션에 존재하는지 확인, 로그인 여부를 체크하는데 사용

5. 세션의 모든 데이터 삭제
session.clear()
- 세션의 모든 데이터를 삭제한다. 로그아웃 기능을 구현시 유용

6. 세션 데이터가 수정되었음을 명시하기
session.modified = True
- 세션의 데이터가 수정되었음을 플라스크에 알림, 이는 세션의 내용이 변경될 때 자동으로 플라스크가 처리하지 못하는 경우 유용

 

Flask에서 쿠키 구현

from flask import Flask, make_response, request, abort

# 쿠키 : 쿠키는 클라이언트 측에서 관리되는 작은 데이터 조각임, 웹 서버는 HTTP 응답을 통해 클라이언트에 쿠키를 전송하고
# 이후 클라이언트는 동일한 서버에 HTTP요청을 할 때마다, 쿠키를 함께 전송한다. 쿠키는 주로 사용자의 선호도, 세션 식별,
# 트래킹 정보 등을 저장하는데 사용됨


app = Flask(__name__)

"""
쿠키 설정 시, set_cooke 매서드 사용
쿠키 설정 시, make_resoponse를 사용하는 이유는
플라스크에서 쿠키를 설정하기 위해서
HTTP 응답 객체가 필요하기 때문. 기본적으로
라우트 함수는 문자열을 반환하고, 플라스크는 이를
HTTP 응답으로 변환. 하지만, 쿠키를 설정하려면
단순 문자열이 아닌 수정이 가능한 응답 객체를 다루어야 함

make_responese() 함수는 라우트의 함수의 반환값을 받아
플라스크의 응답 객체를 생성함, 이 객체를 사용해 HTTP헤더를
설정하거나 쿠키를 추가하는 등의 추가 작업이 가능
"""
@app.route('/set_cookie')
def set_cookie():
    resp = make_response('쿠키를 설정합니다')
    resp.set_cookie('username', 'Jhon')
    return resp

# 요청 객체의 cookies 속성을 통해 조회 가능
# 이는 dict 형태, 키를 사용해 값을 읽을 수 잇음
# request 객체는 사용자가 서버에 보낸 HTTP의 모든 데이터를
# 포함하고 있으며, 여기에는 URL, HTTP 헤더, 쿼리 매개변수,
# 쿠키 등이 포함된다.
@app.route('/get_cookie')
def get_cookie():
    username = request.cookies.get('username', '게스트')
    return f"쿠키로부터 얻은 사용자 이름 : {username}"

# 쿠키가 설정된 사용자만 접근 가능한 라우트
@app.route('/secret')
def secret():
    username = request.cookies.get('username')
    if not username:
        abort(403, description = "접근권한이 없음. 먼저 쿠키를 설정하시오")
    return f"환영합니다. {username}님! 비밀페이지에 접근했습니다."

# 쿠키 삭제시 delete_cookie사용
@app.route('/delete_cookie')
def delete_cookie():
    resp = make_response("쿠키를 삭제합니다.")
    resp.delete_cookie('username')
    return resp

 

1. max_age 옵션
resp.set_cookie('username', 'John', max_age = 60*60*24*7)
max age 옵션은 쿠키가 유지되는 시간을 초 단위로 설정함
이것은 생성시점으로 정확히 1주일 동안 유효하다는 것을 의미함
시간이 지나며 쿠키는 자동으로 만료되어 브라우저에서 삭제됨

2. expires 옵션
resp.set_cookie('username', 'John', expires = datetime(2027, 11, 7))
expires 옵션은 쿠키가 만료되는 정확한 날짜는 지정

3. path 옵션
resp.set_cookie('username', 'John', path = '/app')
path 옵션을 통해 쿠키의 유효 경로를 제한 가능, '/app' 경로와 하위경로만 쿠키 유효

4. domain 옵션
resp.set_cookie('username', 'John', domain = '.example.com')
domain 옵션을 설정하면 쿠키가 특정 도메인에서 유효하게 됨

5. secure 옵션
resp.set_cookie('username', 'John', secure = Ture)
secure 옵션이 True로 설정되면, 쿠키는 HTTPS 연결을 통해서만 전송되어
안전하게 암호화 되어 전송보장

6. httponly 옵션
httponly 옵션을 True로 설정하면, 쿠키는 웹서버를 통해서만 접근이 가능
클라이언트 사이드 스크립트, 예를 들어 자바스크립트는 쿠키에 접근 할 수 없어
보안이 강화됨

'파이썬 이것저것 > 파이썬 백엔드' 카테고리의 다른 글

[python] Flask 배포하기  (0) 2024.08.03
[python] Flask Restapi 구현  (0) 2024.07.27
[Flask] Flask + mysql 연결  (0) 2024.07.21