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 재료를 보고 싶다고 하는 당신, 저희와 함께 북돋워 제발!

    좋은 웹페이지 즐겨찾기