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로 포스트 필터링하기

 

+ Recent posts