Learn-json-web-tokens: ์˜ˆ๋ฅผ Elixir๋กœ ๋ฒˆ์—ญ

์— ๋งŒ๋“  2019๋…„ 03์›” 25์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dwyl/learn-json-web-tokens

์ด ํŠœํ† ๋ฆฌ์–ผ์€ JavaScript์— ์ ํ•ฉํ•˜์ง€๋งŒ JWT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ _first_ principals์—์„œ _understand_๊นŒ์ง€ Elixir์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์€ _๋†€๋ผ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•  ๊ฒƒ

  • [ ] Elixir์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” JWT ์„œ๋ช…/๊ฒ€์ฆ ํŒจํ‚ค์ง€ ์กฐ์‚ฌ
  • [ ] ๋ณดํ˜ธ๋œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด JWT ์ธ์ฆ ํ—ค๋”๊ฐ€ ํ•„์š”ํ•œ ๊ธฐ๋ณธ ์›น ์„œ๋ฒ„ ์ž‘์„ฑ
    ๊ธฐ๋ณธ Elixir ์›น ์„œ๋ฒ„๋Š” https://github.com/dwyl/hits-elixir (๋ถˆ์‚ฌ์กฐ ์•„๋‹˜! ๐Ÿ˜ฎ)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • [ ] ํ…Œ์ŠคํŠธ!
  • [ ] ์ด๊ฒƒ์„ elixir-example.md ๋ผ๋Š” ํŒŒ์ผ์— ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.

@RobStallion ์˜ค๋Š˜ ํ†ตํ™”์—์„œ ์ด์— ๋Œ€ํ•ด ๊ฐ„๋žตํ•˜๊ฒŒ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ด€๋ จ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ธฐํƒ€ ํ—ˆ์šฉ ๊ธฐ์ค€์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

enhancement help wanted technical

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

https://hexdocs.pm/plug/Plug.Session.COOKIE.html์„ ์ฝ์–ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ๐Ÿ’ญ

๋ชจ๋“  4 ๋Œ“๊ธ€

@nelsonic ์ €๋Š” /example ์˜ ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ Elixir ์—์„œ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž‘๋™ ๋ฐฉ์‹์„ ๋” ์ž˜ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ๋Œ€๋ถ€๋ถ„ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
server.js ํŒŒ์ผ์— ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋Ÿฌํ•œ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…ผ๋ฆฌ๋Š” helper.js ์—์„œ

์ด๊ฒƒ์€ ๋ชจ๋‘ Elixir์—์„œ ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(phx ์„œ๋ฒ„ ์—†์ด๋„).

Elixir์—์„œ JWT๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ํŒจํ‚ค์ง€/๋ชจ๋“ˆ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€:

  • ํ˜ธ์„ธ
  • joken (jose๋ฅผ dep๋กœ ์‚ฌ์šฉ)
  • [guardian] (jose๋ฅผ dep๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. jwt๊ฐ€ ์•„๋‹Œ ์ธ์ฆ ํŒจํ‚ค์ง€์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.)
  • yajwt ( jason dep. ์–ธ๊ธ‰๋œ ๊ฐ€์žฅ ์ ๊ฒŒ ์‚ฌ์šฉ๋œ ํŒจํ‚ค์ง€์ด๋ฉฐ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋งŒํผ ์ž์ฃผ ์—…๋ฐ์ดํŠธ/์œ ์ง€๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.)

์ง€๊ธˆ๊นŒ์ง€ joken ๋งŒ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ JWT๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค...

    {:ok, token, _} = LearnJwt.Token.generate_and_sign(%{user_id: 1})
    IO.inspect(token)

    LearnJwt.Token.verify_and_validate!(token)
    |> IO.inspect(label: "===> ")

๋กœ๊ทธ....

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJhdWQiOiJKb2tlbiIsImV4cCI6MTU1MzYzODYyMCwiaWF0IjoxNTUzNjMxNDIwLCJpc3MiOiJKb2tlbiIsImp0aSI6IjJtN3BuMnQ2MDBmMWN1Z3ZlazAwMDA1MyIsIm5iZiI6MTU1MzYzMTQyMH0.HQ-AQjvnIO7tIJF2joB45BJj7oLEznYSKUHZdMf9qe0"
===> : %{
  "aud" => "Joken",
  "exp" => 1553638620,
  "iat" => 1553631420,
  "iss" => "Joken",
  "jti" => "2m7pn2t600f1cugvek000053",
  "nbf" => 1553631420,
  "user_id" => 1
}

verify_and_validate ํ•จ์ˆ˜๋Š” ๋˜ํ•œ JWT๊ฐ€ ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋น„๋ฐ€๋กœ JWT๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๋‹ค๋ฅธ ๋น„๋ฐ€๋กœ ๋ณตํ˜ธํ™”ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค...
config/dev.exs

config :joken,
  default_signer: "secret",
  testing: "test"

some_controller

    {:ok, token2, _} = LearnJwt.Token.generate_and_sign(%{user_id: 1}, :testing)
    LearnJwt.Token.verify_and_validate!(token2)

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค ...

image

์ฆ‰, ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JWT๋ฅผ ๋งŒ๋“ค๊ณ  ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ œ ๋ฐฉ๋ฒ•์„ ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์€ JWT๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๋Š” this ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด render ํ•จ์ˆ˜์˜ assign ์ธ์ˆ˜๋กœ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

render(conn, "index.html", jwt: token)

์ด ์‹œ์ ์—์„œ localStorage ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JWT๋ฅผ ์„œ๋ฒ„๋กœ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์•„์ง ๋‹ค๋ฃจ์ง€ ์•Š์•˜์ง€๋งŒ phoenix ์–‘์‹์„ ์‚ฌ์šฉํ•˜์—ฌ "๊นจ๋—ํ•œ" ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ ํ”„๋ŸฐํŠธ ์—”๋“œ์—์„œ js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. (์ €๋Š” phoenix ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ jwt๋ฅผ ์„œ๋ฒ„๋กœ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” phoenix ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ํ•œ ์˜ˆ๋ฅผ ๋ณธ ์ ์ด ์—†์œผ๋ฏ€๋กœ "๊นจ๋—ํ•œ" ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.)

@RobStallion ์€ JTW๋ฅผ auth_token ๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด https://hexdocs.pm/plug/Plug.Conn.html put_private/3 ์„ ์‚ฌ์šฉํ•˜์—ฌ _๊ณ ๋ ค ํ•˜์‹ญ์‹œ์˜ค_. ๊ตฌํ˜„ ์˜ˆ๋Š” /lib/expected/plugs.ex#L88์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
์˜ค๋Š˜ ์•„์นจ์— ์•„๋ฌด ๋•Œ๋‚˜ ๊ฑธ์œผ๋ฉด์„œ ์ด์•ผ๊ธฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด LMK๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๐Ÿค™

https://hexdocs.pm/plug/Plug.Session.COOKIE.html์„ ์ฝ์–ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ? ๐Ÿ’ญ

๋‹น๋ถ„๊ฐ„์€ ์ž ์‹œ ์‰ฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉฐ์น  ํ›„์— ๋‹ค์‹œ ์˜ฌ ๊ฒƒ์ด๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

nelsonic picture nelsonic  ยท  5์ฝ”๋ฉ˜ํŠธ

KumarS-Naveen picture KumarS-Naveen  ยท  3์ฝ”๋ฉ˜ํŠธ

rhewitt22 picture rhewitt22  ยท  5์ฝ”๋ฉ˜ํŠธ

NE-SmallTown picture NE-SmallTown  ยท  5์ฝ”๋ฉ˜ํŠธ

sarneeh picture sarneeh  ยท  3์ฝ”๋ฉ˜ํŠธ