Single Page Application ์ธ์ฆ
- OAuth2, JWT๋ํ ์ค๋ช
์ ์๋ต
- SPA๋ ํ ํฐ ๋ฐฉ์์ผ๋ก statefulํ๊ฒ ๋ง๋ฌ. cookie(http_only)๋ฅผ ์ฐ๋ฉด js๋จ์์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ. ํ ํฐ์ JWT๋ผ๋ standard๊ฐ ์๊ณ ..
- JWTํ ํฐ๊ฐ์ ๊ฒฝ์ฐ๋ ์์ฒด์ ์ ๋ณด(์ฌ์ฉ์, ๊ถํ, expires๋ฑ)๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐฑ์๋์์ ๋ฐ๋ก ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ง ์์๋ ๋จ.. sns๋ mobile์์๋ expire๋ฅผ ๊ธธ๊ฒ ๊ฐ์ ธ๊ฐ๊ธธ ๋ฐ๋ผ๋๋ฐ.. ๊ทธ๋ ๊ฒ ๋๋ฉด revoke(ํ ํฐ ํ์ง)์ด์๊ฐ ๋ฐ์ํจ. ๊ณ ๋ก long lived refresh token์ด๋ long lived access token์ ์ฌ์ฉ.
- long lived refresh token์ access token์ด (์ผ๋ฐ์ ์ผ๋ก 20-30๋ถ ์ด๋ด) ๋ง๋ฃ๊ฐ ๋๋ฉด refresh token์ผ๋ก access token์ ์ฌ ๋ฐ๊ธ ๋ฐ๋ ๋ฐฉ์. ํ์ง๋ง ์ด๋ฏธ ๋ฐํ๋ access token์ ์์ฒด ๋ง๋ฃ๋๊ธฐ ์ ๊น์ง ํ์งํ ๋ฐฉ๋ฒ์ด ์์(window time). ๊ทธ๋ฆฌ๊ณ refresh token์ ๋ณด๋ ์ญ์ db(or cache) ์ ์ ์ฅํด์ผ ํจ
- long lived access token์ ๋ก์ง์ด ๊ฐ๋จํ๊ณ window time์ด ์๋๋ ๋ชจ๋ token์ db์ ์ ์ฅํด์ผ ํจ. ๊ทธ๋์ผ ํ์ง๊ฐ ๋๋.. github๋ foursqure๋ฑ์์ ์ฐ์.
- ์ด์จ๋ ๋ฐฑ์๋ ์ด๋๊ฐ์(db๋ cache๋ ) ํ ํฐ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ด์ผ ํจ
- ๋ค์์ผ๋ก localStorage์ ์ ์ฅํ ๊ฑด์ง cookie์ ์ ์ฅํ ๊ฑด์ง์ ๋ฌธ์
- ํ ํฐ์ localStorage๊ฐ์๋ฐ ์ ์ฅ์ํ๋ฉด xss์ ์ทจ์ฝํจ.ย
- cookie์ ์ ์ฅ์ํ๋ฉด csrf๋ฌธ์ ์ front์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ ์๊ฐ ์๋ ๋ฌธ์ (http_only์ธ cookie๋ฅผ js๊ฐ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ)๊ฐ ๋ฐ์ํจ
- front์์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๊ธฐ ์ํด ๋ณ๋์ url์ ํตํด ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ผ ํจ
- csrf๋ฅผ ์ฐ๋ ค๋ฉด session์ ์จ์ผ ํจ. ๊ทธ๋ผ ๋ session์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฑ์๋์ db(cache)๊ฐ ํ์ํจ. ย csrfํ ํฐ์ cookie(no http_only)๋ฅผ ํตํด ์ ์กํ๊ณ js์์ ์ฝ์ด์ ํค๋(ajax)๋ request parameter(form submit)๋ก server๋ก ๋ณด๋ด๋ ๋ฐฉ์ ์ถ์ฒ.
- ์ด์จ๋ ์ ์ฅ์๋ cookie ์ถ์ฒ. localStorage xss๋ ์ทจ์ฝ์ ์ ์ด์ฐํ ์๊ฐ ์์ด์..
์ด๊ฑด ๋ฏธ ๊ฒ์ฆ.. csrf๋ฅผ ์ํ session ๊ณต๊ฐ์ ๋ฐ๋ก ๋์ง๋ง๊ณ .. token์ ์ฅ์ value๋ก ์ ์ฅํ๋ ๊ฑด?.. token์ db์ ์ ์ฅํ๊ฒ ๋๋ฉด ๊ตฌ์ง JWT๋ฅผ ์ธ ํ์๊ฐ ์๋.. ๊ทธ๋ฅ session id์ฒ๋ผ crypto safeํ ๊ฐ์ ์จ๋ ๋์ง ์๋..
๊ณ์ ์
๋ ๋ ์ ์์..
https://stormpath.com/blog/token-auth-spa/
https://stormpath.com/blog/jwt-the-right-way/
http://stackoverflow.com/questions/3487991/why-does-oauth-v2-have-both-access-and-refresh-tokens/12885823#12885823
https://github.com/expressjs/session/blob/master/index.js
https://github.com/crypto-utils/uid-safe/blob/master/index.js
https://github.com/jshttp/cookie/blob/master/index.js
https://github.com/tj/node-cookie-signature/blob/master/index.js