Flask(4)


Cookieとセッション


🐤 クッキー

  • Cookieの概念を導入して、無接続、無状態のHTTPの欠点を解決します!
  • Webサーバは、ブラウザに小さなレコード情報ファイルをローカルコンピュータ上のファイルまたはメモリに格納するように指示します.
  • ファイルの情報は、インターネットユーザーが同じサイトにアクセスするたびに読み出され、いつでも新しい情報に変更される可能性があります.
  • Webサーバが応答すると、クッキーを頭の上に置いて送信できます.
  • 🌈 Cookieの操作手順

  • クライアント要求ページ.(ユーザアクセスWebサイト)
  • WebサーバはCookieを生成します.
  • で生成するCookieに情報が含まれてHTTP画面に戻る場合、
  • .
  • は、クライアントに一括して返却されます.
  • で受信Cookieは、クライアントが保有(ローカルPCに格納)する
  • である.
  • が再度サーバに要求を出すと、要求とともにCookieが送信される.
  • で同じサイトに再アクセスした場合、クライアント上のPCに対応するCookieがあります.
    リクエストページとともにCookieを送信します.
  • Cookieに関する情報が各Header(Http Header)に追加されるため、大量のトラフィックが発生する.
  • 支払情報等をCookieに格納している場合、Cookieが漏洩した場合、セキュリティ上の問題が発生する可能性があります…!
  • 🐤 セッション


  • Cookieのトラフィックの問題を解決し、Cookieのセキュリティの問題を変更するために発生します.

  • 同じユーザ(ブラウザ)からの一連の要件を一定期間ステータスと見なし、一貫性を保つ技術.(ここで、しばらくの間、アクセス者は、Webブラウザを介してWebサーバに接続された点からWebブラウザを終了して接続を終了する)、すなわち、アクセス者は、Webサーバに接続された状態をセッションと呼ぶユニットと見なす.

  • Webサーバには、Webコンテナの状態を保持するための情報が格納される.Webサーバに格納されているCookie(=セッションCookie).ブラウザを閉じたり、サーバからセッションを削除したりする場合にのみ削除されるため、Cookieよりもセキュリティが優れています.格納データに制限はありません.(サーバ容量が許可されている限り...)各クライアントに一意のセッションIDを付与する.セッションIDを使用してクライアントを区別し、各クライアントのニーズを満たす.
  • 🌈 セッションの操作順序

  • クライアント要求ページ.(ユーザアクセスWebサイト)
  • サーバは、アクセスクライアントのRequest-Header 필드인 Cookie를 확인である.클라이언트가 해당 session-id를 보냈는지 확인.
  • セッション-idが存在しない場合、서버는 session-id를 생성해 클라이언트에게 돌려준다.
  • Cookieを使用して、
  • サーバから返されたセッションIDをサーバに保存します.
  • Cookie名称:JESSIONID
  • クライアントは、再接続時にこのCookie(JESSIONID)を使用してセッションID値をサーバに渡します.
  • Cookieとセッションの違い(表!)


  • と書くときにまとめると、Cookieとセッションの最大の違いは格納場所の違いです.Cookieはクライアントに格納する形式であり,セッションはWebサーバに格納して確認する方式である.サーバ側はセッションidを確認し、存在しない場合はセッションidを送信し、対応するセッションidを見つけて応答を作成します.
  • 🐤 Webページからフォームを受信し、Cookieをクライアントに渡すコード。

    # app.py
    
    @app.route('/')
    def index():
       return render_template('index.html')
       
    @app.route('/setcookie', methods = ['POST', 'GET'])
    def setcookie():
       if request.method == 'POST':
         user = request.form['nm']
    
         resp = make_response("Cookie Setting Complete")
         resp.set_cookie('userID', user)
       
       return resp
       
    @app.route('/getcookie')
    def getcookie():
        name = request.cookies.get('userID')
        return '<h1>welcome ' +name+ '</h1>'
    
    if __name__ == '__main__':
        app.run(debug = True)
    
    # 해당 폼은 /setcookie URL로 전송되는데 폼으로 데이터를 입력받을 경우, POST 메소드로 /setcookie에 오게 됨!
    # index.html
    
    <form action = "/setcookie" method = "POST">
             <p><h3>Enter userID</h3></p>
             <p><input type = 'text' name = 'nm'/></p>
             <p><input type = 'submit' value = 'Login'/></p>
          </form>

    🐤 セッションコード


    Cookieとは異なり、セッション関連のデータは서버에 저장である.サーバが管理できる観点から、안전성이 좋아서は通常ログインに使用される.フラスコでは、セッション数は딕셔너리의 형태로 저장であり、この値は鍵によって取得することができる.セッションを使用するには、해당 값을 암호화하기 위한 Key 값을 코드에서 지정が必要です.
    from flask import Flask, request, session, redirect, url_for
    app = Flask(__name__)
    app.secret_key = 'get some sleep'
    
    # 세션 사용하려면 해당 값을 암호화해주기 위해 Key값을 코드에서 지정해줘야함. 
    약간 나른한 오후니까 get some sleep으로 secret_key를 지정해주기 ㅎㅎㅎ
    
    @app.route('/')
    def index():
        if 'username' in session:
            username = session['username']
            return 'Logged in as ' + username + '<br>' + \
            "<b><a href = '/logout'>click here to log out </a></b>"
    
        return "you are not logged in <br><a href = '/loging'></b>" + \
            "click here to log in</b></a>"
    
    # /URL: 조건문 if를 써서 flask 세션 정보안에 username이라는 세션 정보의 유무에 따라 로긴 했는지 안했는지 판단!
    # 맨처음 http://127.0.0.1:5000/ 여기로 들어가면 else로 처리돼서 you are not logged in 처리 되는 것.
    
    @app.route('/login', methods = ['GET', 'POST'])
    def login():
        if request.method == 'POST':
            session['username'] = request.form['username']
            return redirect(url_for('index'))
        return '''
    
        <form action = "" method = "post">
            <p><input type = text name = username></p>
            <p><input type = submit value = Login></p>
        </form>
        '''
    # 실제 로그인하는 form이 있는 /login URL.
    # 맨 첨 접속했을 때는 GET 메소드로 요청이 오니까 로긴하기 위한 폼 전송!
    # 폼을 통해 POST 요청이 오면 username이라는 세션을 생성하여 입력받은 폼의 데이터를 세션 저장하고 맨 첨 페이지로 리다이렉션하기.
    
    @app.route('/logout')
    def logout():
        session.pop('username', None)
        return redirect(url_for('index'))
    
    # 로그아웃도 해당 세션 정보를 제거하는 것으로 연결 끊기 가능. 세션 제거는 pop 메소드를 사용하면 됨!!
    # 서버에 세션 값이 저장되어있기 때문에 브라우저를 껐다가 켜든, 여러개를 켜든 이미 로그인이 된 상태로 페이지가 보여짐.
    # 해당 세션 ID 값은 클라이언트에 쿠키로 존재하며, 페이지에 들어갈 때마다 인증을 하게 되는데, 이 쿠키를 지워버리면 클라이언트 측면에서는 로그아웃과 같은 효과를 볼 수 있음.
    # 서버 측의 세션 정보는 사라지지 않기 때문에 이미 사라져버린 세션을 계속 잡고 있게 된다. 플라스크에서도 이런 경우를 대비하여 각 세션의 유효기간이 정해져 있으며 아무 설정도 하지 않을 경우, 31일로 설정되어 있다.
    
    if __name__ == '__main__':
        app.run(debug = True)
    # 만약 직접 세션의 유효기간을 직접 설정하고 싶다면, 아래와 같은 함수를 추가해주면 된다.
    from datetime import timedelta
    from flask import session, app
    
    @app.before_request
    def make_session_permanent():
    	session.permanent = True
        app.permanent_session_lifetime = timedelta(minutes=5)
  • セッションの印刷時に表示される画面です.セッション内のユーザ名の形状は同じです.Webサーバに格納されているユーザ名はStellarであるため、ifセクションではok、セッション中のユーザ名がユーザ名に含まれてログインしたことを示す...!
  • /login、アイデンティティを入力してindexにリダイレクトし、そこでセッション内のユーザー名と確認してログインします.あ、順番が混同されました.クッキーとセッションを学ぶにはもっと熟知する必要があるようです.これで私が瓶を振る時ももっと簡単に...!復習する💪
  • ソース1:https://hahahoho5915.tistory.com/32
    ソース2:https://blog.naver.com/shino1025/221355012951