토큰이란?
서버가, 각각의 클라이언트를 누군지 정확히 구별할 수 있도록,
유니크한 정보를 담은 암호화 데이터.
유저 구별이 가능해야, 유저의 권한에 맞는 정확한 기능을 응답할 수 있다.
( 사용자 구분 및 정보 유출방지 )
토큰의 특징, 용도
사용자에 대한 정보를 암호화해서 브라우저에 저장하고,
웹페이지 접속시, 저장된 정보를 가져와
사용자마다 다른 화면을 보여주는 용도로 사용할 수 있다.
앱이 서버에 토큰 전송,
서버가 이 토큰을 사용해 토큰 값 응답.
토큰 사용방식
1. 사용자가 서버에 로그인 한다.
2. 서버가 로그인 정보를 받아서 토큰을 만든다.
3. 사용자는 브라우저에서 토큰을 받아 임시저장한다.
4. 사용자가 토큰과 함께 서버에 요청을 보낸다.
5. 서버는 자신이 만든 토큰이 맞는지 확인하고, 토큰이 맞는 경우에만 올바른 응답을 보내준다.
jsonwebtoken (JWT) 이란?
json 형식의 토큰을 만들 수 있는 Node.js 패키지
JWT 동작 방식
headers: {
Authorization: `Bearer ${jwt}`
}
HTTP 헤더의 Autorization 부분에,
"Bearer" + " " + JWT 형식의 문자열을 전송한다.
서버에서 Authrization을 가져와 이를 처리하고,
그 결과를 HTTP 헤더에 담아 응답한다
jsonwebtoken 설치
npm install jsonwebtoken
jsonwebtoken 사용법
// index.js
// jsonwebtoken 사용하기 위해 불러오기
import jwt from "jsonwebtoken";
// 사용자 정보 예시
const user = { id: "json" }
// 토큰 만들때 사용할 비밀번호 만들기 ( 절대 공유 하면 안됨 - 이것을 알면 누구나 똑같은 토큰을 만들 수 있음 )
const SECRET_KEY="XOZUhcOIiv7ltnI6Dm6D7QYwcRB5dhqX"
// 만든 비밀번호와, 사용자 정보합쳐서 token 만들기
const token = await jwt.sign({ id:user.id }, SECRET_KEY);
// jsonwebtoken은 sha-256 해시함수를 이용해 정보를 암호화 해준다.
// 로그인 시, 만들어진 토큰을 브라우저에 전송해주자
다른 방식으로 토큰 만들기
// RSA SHA256
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256'});
토큰 유효기간 설정하기
// 현재시각 부터 1시간 뒤까지 유효
jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
// 2번째 방법
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });
// 3번째 방법
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: '1h' });
비밀번호 사용해서 사용자 정보 복구하기
// verify 함수 이용
const decode = await jwt.verify(token, process.env.SECRET_KEY);
console.log(decode)
/*
사용자 정보와, 해시 함수 반복 횟수 정보 복구
{
id: "json",
iat: 16368234
}
*/
jwt 토큰 정보
iat : 생성된 시각
exp (expire) : 유효 시간
반응형