JWT

홍준섭·2023년 3월 24일

개발 공부

목록 보기
18/20

JWT 이해

세션기반, 토근 기반

세션 기반:

서버가 사용자가 로그인 중임을 기억하고 있다는 것.
세션 기반 인증 시스템에서 사용자가 로그인을 하면, 서버는 세션 저장소에 사용자의 정보를 조회하고 세션 id를 발급한다. 발급된 id는 주로 브라우저의 쿠키에 저장. 그 다음에 사용자가 다른 요청을 보낼 때마다 서버는 세션 저장소에서 세션을 조회한 후 로그인 여부를 결정하여 작업을 처리하고 응답을 한다.
세션 기반 인증의 단점은 서버를 확장하기가 번거로워질 수 있다는 점이다. 만약 서버의 인스턴스가 여러 개가 된다면, 모든 서버끼리 같은 세션을 공유해야 하므로 세션 전용 데이터베이스를 만들어야 할 뿐 아니라 신경 써야 할 것도 많다.

토큰 기반:

토큰은 로그인 이후 서버가 만들어 주는 문자열이다. 해당 문자열 안에는 사용자의 로그인 정보가 들어 있고, 해당 정보가 서버에서 발급되었음을 증명하는 서명이 있다. 서버에서 만들어 준 토큰은 서명이 있기 때문에 무결성이 보장된다. 여기서 무결성이란 정보가 변경되거나 위조되지 않았음을 의미하는 성질이다. 사용자가 로그인을 하면 서버에서 사용자에게 해당 사용자의 정보를 지니고 있는 토큰을 발급해주고, 추후 사용자가 다른 API를 요청하게 될 때 발급받은 토큰과 함께 요청하게 된다. 그러면 서버는 해당 토큰이 유효한지 검사하고, 결과에 따라 작업을 처리하고 응답한다.

토큰 발급 및 검증하기

토큰을 만들기 위해서는 jsonwebtoken 모듈 설치

$ yarn add jsonwebtoken

비밀키 설정

.env파일에 JWT_SECRET 값으로 설정
macOS/리눅스의 경우

$ openssl rand -hex 64

토큰 발급하기

import mongoose,{Schema}from 'mongoose';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';

UserSchema.methods.generateToken = function(){
  const token = jwt.sign(
    // 첫 번째 파라미터에는 토큰 안에 집어넣고 싶은 데이터를 넣는다.
    {
      _id:this.id,
      username: this.username,
    },
    // 두 번째 파라미터에는 JWT 암호를 넣는다.
  	process.env.JWT_SECRET,
  	{
      espiresIn: '7d',
      
    },
  );
  return token;
};

토큰을 사용할 때는 주로 두 가지 방법을 사용한다. 첫 번째는 브라우저의 localStorage 혹은 sessionStorage에 담아서 사용하는 방법이고, 두 번째는 브라우저의 쿠키에 담아서 사용하는 방법이다.

브라우저의 localStorage 혹은 sessionStorage에 토큰을 담으면 사용하기가 매우 편리하고 구현 하기도 쉽다. 하지만 만약 누군가 페이지에 악성 스크립트를 삽입한다면 쉽게 토큰을 갈취 할 수 있다.

쿠키에 담아도 같은 문제가 발생할 수 있지만, httpOnly라는 속성을 활성화하면 자바스크립트를 통해 쿠키를 조회할 수 없으므로 악성 스크립트로부터 안전하다. 그 대신 토큰을 쿠키에 담으면 사용자가 서버로 요청 할 때마다 무조건 토큰이 함께 전달되는 점을 이용해서 사용자가 모르는 원하지 않는 API 요청을 하게 만들 수 있다.

profile
개발 공부중입니다

0개의 댓글