-
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 데이터 저장 - Plug.Conn.put_session의 [Key, Value] 값은 config.exs 의 "secret_key_base" 의 값과 함께 암호화 됩니다. (secret_key_base 값과 EndPoint Module의 Plug.Session의 signing_salt 값으로 암호화)
- 암호화 한값은 Cookie로 만들어져 클라이언트(브라우저)에 전송되어, 클라이언트에 저장됩니다.
- 이후의, 서버 접속시 클라이언트(브라우저)는 HTTP Header를 통해 저장된 Cookie를 전송합니다.
- 서버에서는 HTTP Header의 Cookie 값을 복호화하고, 이 값을 Plug.Conn.get_session으로 참조 할 수 있도록 합니다.
아래의 소스코드로 session을 put 하도록 구현한 후,
defmodule PhxSessionWeb.PageController do
use PhxSessionWeb, :controller
def index(conn, _params) do
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 값을 참조할 수 있습니다.
'Elixir 프로그래밍' 카테고리의 다른 글
Process 생성하기 (0) 2022.07.19 Process (OTP) 들어가기, (0) 2022.07.12 Elixir Phoenix : Controller와 View(Template)간의 데이터 전달 : assigns (2) 2019.10.15 Elixir Phoenix : View와 Template (4) 2019.10.13 Elixir Phoenix : Router와 Controller (0) 2019.10.08