ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Elixir Phoenix : Session 관리
    Elixir 프로그래밍 2019. 10. 22. 21:34

    앞장에서 적은 assigns는 , 하나의 connection을 처리하기 위한 과정에서 Controller와 View 간의 데이터 전달 방법이였습니다.

    Conn 에 Assigns로 할당된 값은 connection의 처리가 완결된 이후에는 사라집니다. 

     

    이번글에서는, 웹에서 사용자의 로그인 처리등에 사용되는 Session의 관리에 대한 내용을 적겠습니다.

    이번글은 https://phoenixframework.org/blog/sessions에 대한 설명이라 할 수 있습니다. 

     

     

    Elixir Phoenix에서는 session관리가 대단히 편리하게, Key, Value로 원하는 값을 관리할 수 있습니다.

    Session관련함수는 다음의 4개의 함수 입니다.  https://hexdocs.pm/plug/Plug.Conn.html#put_session/3

    • Plug.Conn.put_session :  Session에 Key, Value 형식으로 원하는 데이터를 저장
    • Plug.Conn.get_session, Plug.Conn.fetch_session  :  Key에 Session에 저장된값 읽어오기 
    • Plug.Conn.delete_session : Session에서 Key에 해당하는 데이터 삭제하기

     

    위에서 적었듯이, Plug.Conn의 assigns는 하나의 connection에 대한 처리가 종료되면 할당된 값이 삭제됩니다.

    이에 반해, Session에 저장된 값은 사용자가 동일 브라우저를 사용하여 동일 PC에서 서버에 접속하는 한 계속 유지가 됩니다. (Cookie를 이용하기 때문에..)

     

    코드를 살펴보기 전에, 이의 구현이 어떻게 이루어지는지 생각해 겠습니다.

    stateless connection인 HTTP 에서 계속 한 값을 유지하는 방법은 무엇일가요.?  

     

    Phoenix에서는 이를 위해 Cookie와 ETS(Erlang Term Storage : 작은 내부 DB라 생각하면 됩니다.) 를 사용하며, 

    이글에서는 Cookie를 사용하는 방식에 대해서만 적겠습니다.  ETS 의 사용에 대한 내용은 https://phoenixframework.org/blog/sessions 를 참조하세요. 

     

    Phoenix 의 Session 데이터 저장

     

    1. Plug.Conn.put_session의  [Key, Value] 값은 config.exs 의 "secret_key_base" 의 값과 함께 암호화 됩니다.  (secret_key_base 값과 EndPoint Module의 Plug.Session의 signing_salt 값으로 암호화)
    2. 암호화 한값은 Cookie로 만들어져 클라이언트(브라우저)에 전송되어, 클라이언트에 저장됩니다.
    3. 이후의, 서버 접속시 클라이언트(브라우저)는  HTTP Header를 통해 저장된 Cookie를 전송합니다.
    4. 서버에서는 HTTP Header의 Cookie 값을 복호화하고, 이 값을 Plug.Conn.get_session으로 참조 할 수 있도록 합니다. 

     

    아래의 소스코드로 session을 put 하도록 구현한 후, 

     

    defmodule PhxSessionWeb.PageController do

      use PhxSessionWeb, :controller

     

      def index(conn, _paramsdo

        conn 

         |> Plug.Conn.put_session("session" , "session_value" )

         |>render("index.html")

      end

    end

     

    curl 을 이용하여 확인을 해보면,

    위와 같이  _phx_session_key 항목으로 cookie가 생성된 것을 확인할 수 있습니다.

     

    이후의, HTTP Request에서는 이 cookie가 전달되므로, 

    Plug.Conn.get_session에서는 cookie에 저장된 key, value 값을 참조할 수 있습니다. 

     

     

     

Designed by Tistory.