23.1 JWT의 이해
세션 기반 인증과 토큰 기반 인증의 차이
- 세션 기반 인증 시스템
- 서버가 사용자가 로그인 중임을 기억하고 있음. 로그인하면, 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id를 발급함. 발급된 id는 주로 브라우저의 쿠키에 저장.
- 서버를 확장하기가 번거로움. (서버 여러개 되면 세션 전용 데이터베이스 만들어야 함.)
- 토큰 기반 인증 시스템
- 토큰은 로그인 이후 서버가 만들어 주는 문자열. 이 안에 사용자의 로그인 정보가 들어 있고, 해당 정보가 서버에서 발급되었음을 증명하는 서명이 들어 있음. (무결성 보장)
- 로그인하면, 서버에서 사용자에게 해당 사용자의 정보를 지니고 있는 토큰을 발급해 주고, 추후 사용자가 다른 API를 요청하게 될 때 발급받은 토큰과 함께 요청하게 됨.
- 서버 리소스 절약. 서버의 확장성 높음
23.2 User 스키마/모델 만들기
- 모델 메서드 만들기
- 스태틱 메서드 만들기
23.3 회원 인증 API 만들기
- 회원가입 구현하기
- 로그인 구현하기
23.4 토큰 발급 및 검증하기
yarn add jsonwebtoken
23.4.1 비밀키 설정하기
openssl rand -hex 64
23.4.2 토큰 발급하기
- localStorage, sessionStorage : 구현과 사용이 편리하지만, XSS에 취약.
- 쿠키 : httpOnly 속성을 활성화해서 XSS방지, CSRF는 CSRF 토큰 사용 및 Referer 검증 등의 방식으로 제대로 막을 수 있음.
const token = jwt.sign(
{
_id: this.id, username: this.username //첫 번째 파라미터 -> 토큰 안에 넣고 싶은 데이터
},
process.env.JWT_SECRET, //두 번째 파라미터 -> JWT 암호
{
expiresIn: '7d', //세 번째 파라미터 -> 유효기간
}
);
23.4.3 토큰 검증하기
const decoded = jwt.verify(token, process.env.JWT_SECRET);
23.4.4 토큰 재발급하기
23.4.5 로그아웃 기능 구현하기
23.5 posts API에 회원 인증 시스템 도입하기
23.6 username/tags로 포스트 필터링하기
'개발 도서 > 리액트를 다루는 기술(개정판)' 카테고리의 다른 글
22장 mongoose를 이용한 MongoDB연동 실습 (0) | 2020.06.21 |
---|---|
21장 백엔드 프로그래밍:Node.js의 Koa 프레임워크 (0) | 2020.06.20 |
20장 서버 사이드 렌더링 (0) | 2020.06.20 |
19장 코드 스플리팅 (0) | 2020.06.14 |
18장 리덕스 미들웨어를 통한 비동기 작업 관리 (0) | 2020.06.14 |