Phoenix에서 쿠키 얻기/발행

fukuoka.ex의 piacere입니다.
방문해 주셔서 감사합니다

최근에 쿠키를 사용하고 있습니까?

SPA화가 진행됨에 따라, 보다 간편한 WebStorage나, 브라우저나 PC/스마트폰을 선택하지 않는 「인증+GCS/S3/각종 DB」로의 서버 측에의 유저 데이터 유지가 대두해, 옛날만큼 쿠키를 사용하지 않게 되었다 있습니다.

또한 LiveView를 사용하면 더 이상 프론트 측에 데이터를 넣을 기회 자체가 사라지고 점점 쿠키에서 멀어질 수 있습니다.

그런 가운데, 복수 SaaS를 넘는 시스템간 제휴의 개발에서, 오랜만에 쿠키를 사용하는 요건이 나오고, 「아레?… , 구현했으므로 내용을 공유합니다.

"Phoenix"은 Elixir 웹 프레임 워크입니다.

내용이 재미 있거나 도움이되면 "좋아요"잘 부탁드립니다

본 칼럼의 검증 환경, 사전 구축의 커멘드



본 칼럼은, 이하 환경에서 검증하고 있습니다(Windows에서 실시하고 있습니다만, Linux나 mac에서도 동작한다고 가정합니다)
  • Windows 10
  • Elixir 1.8.1     ※ 최신 버전의 설치 절차는 여기
  • Phoenix 1.4.8 ※ 최신 버전의 설치 절차는 여기

  • 칼럼의 샘플은 이쪽의 구축 순서로, Phoenix PJ를 구축하고 있는 전제에서 설명합니다.

    쿠키 발행 / 취득 처리를 넣는 대상



    쿠키는 웹 페이지에서 발행/취득하므로 웹 페이지 관련 처리가 대상입니다.

    index.html.eex를 대상으로 해설합니다만, 실제로 코드를 넣는 부분은 컨트롤러가 됩니다.

    ※변경 전 lib/sample_db_web/controllers/page_controller.ex
    defmodule SampleDbWeb.PageController do
      use SampleDbWeb, :controller
    
      def index(conn, _params) do
        render(conn, "index.html")
      end
    end
    

    쿠키 얻기



    첫째, 쿠키를 얻는 것입니다.

    conn.cookies에 맵으로서, 모든 쿠키가 저장되어 있으므로, 키 지정하는 것으로, 값을 취득할 수 있습니다

    ※변경 후 ① lib/sample_db_web/controllers/page_controller.ex
    defmodule SampleDbWeb.PageController do
      use SampleDbWeb, :controller
    
      def index(conn, _params) do
        # v---add here
        single_signon_id = conn.cookies[ "single_signon_id" ]
        # ここに取得したcookieの処理を入れる
        render(conn, "index.html")
      end
    end
    

    간단합니다.

    쿠키 발행



    다음은 쿠키 발행입니다

    conn을 Plug.Conn.put_resp_cookie()에 전달하여 응답에 쿠키를 부여하고 쿠키를 발행할 수 있습니다.

    덧붙여 「http_only: false」를 제외하거나, true를 설정하면, 브라우저측에 쿠키를 남기지 않는 발행이 됩니다

    ※변경 후 ① lib/sample_db_web/controllers/page_controller.ex
    defmodule SampleDbWeb.PageController do
      use SampleDbWeb, :controller
    
      def index(conn, _params) do
        # v---add here
        conn_cookie = conn |> put_resp_cookie( "single_signon_id", "ThisIsID", [ http_only: false ] )
        render(conn_cookie, "index.html")
        #       ^---modify here
      end
    end
    

    Elixir처럼 파이프를 사용하여 여러 쿠키를 동시에 발행 할 수 있습니다.

    ※변경 후② lib/sample_db_web/controllers/page_controller.ex
    defmodule SampleDbWeb.PageController do
      use SampleDbWeb, :controller
    
      def index(conn, _params) do
        # v---add here
        conn_cookie = conn 
            |> put_resp_cookie( "single_signon_id",   "ThisIsID",  [ http_only: false ] )
            |> put_resp_cookie( "single_signon_apps", "mail,chat", [ http_only: false ] )
        # ^---add here
        render(conn_cookie, "index.html")
        #       ^---modify here
      end
    end
    



    Phoenix에서 쿠키의 취급에 대해 정리했습니다.

    SPA 혹은 서버 사이드 유지가 전성이라고는 말해, 시스템간 제휴나 타사 cookie 이용, 레거시 시스템 접속으로 이용할 기회는 있다고 생각하므로, 기억해 두어 손해는 없을까 생각합니다

    p.s.「좋아요」 잘 부탁드립니다



    페이지 왼쪽 상단의 또는 을 클릭해 주셔서 감사합니다
    여기의 숫자가 늘어나면, 작가로서는 「우케하고 있다」라는 감각을 얻을 수 있어 연재를 더욱 진화시켜 나가는 동기 부여가 되기 때문에, 보다 Elixir 재료를 보고 싶다고 하는 당신, 저희와 함께 북돋워 제발!

    좋은 웹페이지 즐겨찾기