Single Page Application 인증
- 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