
Node JWT
쿠키의 단점
쿠키를 지원하는 클라이언트에서 밖에 사용할 수 없음- 적절히 관리되지 않은 쿠키는
보안에 취약하며, 관리를 하려고 해도CORS 대응이 복잡함
Token Based Auth
- 토큰이란,
사용자의 자격증명(아이디, 패스워드 등)을 통해 인증이 이루어진 후,특정 자원에 대한 자격증명으로서대신 사용되는 인증 수단 - 서버에 요청을 할 때마다
토큰을 요청에 직접 포함시켜서 전송 (주로 Authorization 헤더에 넣어서 전송)
Cookie vs Token
token을 사용할때는 프론트와 백엔드가 다른 url을 사용할때 자주 사용된다.- client side의 js가 token 정보를 기억한다.
토큰 사용의 장점
- 다양한 인증 수단(전화번호, 공인인증서, 생체정보 등)의 인증 결과를
토큰이라는 하나의 수단으로 통일할 수 있음 - 쿠키를 사용하지 않음으로써
CORS 관련 문제를 회피할 수 있음
토큰 사용의 단점
- 매 요청에 토큰이 포함되게 되므로
적당히 짧은 길이를 유지해야 함 토큰 유출에 대한 대비책이 필요 (토큰에 유효기간을 두거나, 유출된 토큰을 강제로 무효화하는 등의 방법을 사용)- 쿠키와는 다르게,
클라이언트에서 직접 토큰을 저장하고 관리해야 함
Web Storage
- 브라우저에서 키-값 쌍을 저장할 수 있는 저장소
- 쿠키에 비해 사용하기 편리하고 저장 가능한 용량도 큼(10MB 가량)
- 브라우저 탭이 닫히면 내용이 삭제되는
sessionStorage, 브라우저 탭이 닫혀도 내용이 유지되는localStorage가 있음- localStorage.setItem(‘foo’, ‘bar’) // key value 저장가능
보안 상 주의사항
- 토큰을 localStorage에 저장하게 되면 자바스크립트로 토큰을 탈취할 수 있게 되므로,
웹사이트에 악성 스크립트를 삽입하는 공격(XSS)에 노출되지 않도록 신경써야 함 - 직접 DOM API를 사용하는 대신 EJS, React 같은
템플릿 언어를 사용하기만 해도 XSS에 대한 방어는 충분함 - token 기반으로 사용할 때는
서명을 해주면 보안성을 높힐수있다.암호화는 성능을 많이 낭비하게된다.
JSON Web Token
- 최근 널리 사용되고 있는
토큰 형식의 표준 - 토큰 안에
JSON 형식으로 정보를 저장함 - 보안을 위해 서명 또는 암호화를 사용할 수 있음
jwt.io
JWT 실습
- server.js를 다이해해두는 것이 좋다.
1 | const express = require('express') |
const token = jwt.sign({username, isAdmin: matched.isAdmin}, SECRET) 서명을 할때 SECRET이라는 비밀키를 생성한다
- Axios는 get, header, delete 같은 읽기전용은 인자를 2개만 받는데
post, fetch, 이런값들은 인자를 3개를 받는다. 2번째 인자로 받을 데이터를 넣는다.
1 | // 토큰 받아오기 |
- 중복되는 값을 제거하기 위한 방법으로는 Axios instance를 만들면 된다.
1 | // Axios.create |