Elixir 프로그래밍

Elixir Phoenix : Session 관리

BitzFlex 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 값을 참조할 수 있습니다.