토큰

HARIBO·2021년 11월 23일
0

토큰 기반 인증

  • 세션 기반 인증은 서버가 유저 인증 정보를 담고 있어서 서버에 부담이 간다. 그에 비해 토큰 기반 인증은 유저 정보를 암호화해서 클라이언트가 가지고 있을 수 있다.
  • 서버는 클라이언트에 대한 정보를 저장할 필요가 없다.(무상태성을 가진다)
  • 토큰을 생성하는 서버가 토큰을 만들지 않아도 된다.
  • 권한 부여에 용이하다.

JWT(JSON Web Token)

  • 정보를 JSON개체로 전송하기 위한 개방형 표준. 개인 키를 이용해 서명을 할 수 있고, 권한 부여, 정보 교환 등에 사용된다.
  • JSON을 사용하기 때문에 프로그래밍 언어의 객체에 매핑하기 쉽고, XML을 사용하는 토큰들 보다 인코딩 시 길이가 작다고 소개하고 있다.
  • 구조
  • 작동
//유저 정보를 확인한 서버의 토큰 생성
//express 모듈 사용
const jwt = require('jsonwebtoken');

let accessToken = jwt.sign(<payload>, <secret>,<옵션들 ex){expiresIn: "10h"}>);
let refreshToken = jwt.sign(<payload>, <secret>,<옵션들 ex){expiresIn: "20h"}>);

//refreshToken은 쿠키에 전달
res.cookie('refreshToken', refreshToken, <쿠키 옵션들>})
//accessToken은 response body에 전달
res.json({accessToken: {accessToken}});


//클라이언트의 로그인 요청
axios.post('https://localhost:4000/login',<body>,<header>)
   .then(result => {
     <accessToken을 저장. react의 경우 state등에 저장한다.>
   })
   .catch(err => <에러처리>)

//클라이언트의 토큰을 이용한 요청
//'Authorization'헤더에 'Bearer '라는 문자열과 토큰을 합쳐서 요청을 보낸다.
axios.get(<주소>,
    {
      headers: {
        Authorization: 'Bearer ' + <accessToken>
      } 
    })

//서버의 토큰 유효성 검사
//Beaerer 라는 문자열 분리
let token = req.headers.authorization.split(" ")[1];
    
jwt.verify(token, <secret>, (err, result) => {
  <next()를 호출해 다음 미들웨어로 연결, result로 DB에서 유저 정보 조회 등...>
}

출처
https://jwt.io/introduction
https://developer.okta.com/blog/2019/02/14/modern-token-authentication-in-node-with-express

0개의 댓글