쿠키기반인증은 쿠키에 유저정보를 담는 방식
-> 쿠키 탈취되면 심각한 위험초래
세션기반인증은 서버(혹은 DB)에 유저정보를 담고,
해당 정보를 확인할 수 있는 세션ID를 쿠키에 담는 방식
-> 쿠키를 가져오면 쿠키에 있는 세션ID를 확인해서 유저정보 보여줌
-> 마찬가지로 쿠키가 탈취되면 위험 + 서버에 정보담는 방식이라 서버에 부담
토큰기반인증은 유저정보를 암호화해서 클라이언트에 담음
토큰기반 인증 중 가장 대표적인 방법
JSON 포맷으로 사용자에 대한 속성을 저장하는 웹 토큰
{
"alg": "HS256",
"typ": "JWT"
}
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret);
세션인증방식보다 토큰인증방식이 더 안전하다고 말할 수 없다.
각각의 인증방식의 장단점을 인지하고 적절하게 쓰는 것이 좋다.
index.js
https 서버 구현package.json
위치에 인증서 파일 가져오기(key.pem,cert.pem).env
에 데이터베이스에 환경변수 설정(데이터베이스 이름 및 비밀번호 등)controllers/users/login.js
에서 POST / login 구현// jsonwebtoken 라이브러리를 사용해 토큰을 생성하는 방법
const jwt = require('jsonwebtoken');
const token = jwt.sign(토큰에_담을_값, ACCESS_SECRET, { 옵션1: 값, 옵션2: 값, ... });
// 작성한 코드
var jwt = require('jsonwebtoken'); // 이건 맨위에 이미 작성되어 있었음
const Payload = {
id,
userId,
email,
createdAt,
updatedAt,
iat: 151623391, // 이건 예제에서 가져옴
exp: Math.floor(Date.now() / 1000) + (60 * 60) // 구글링해서 형식 찾음
}
// 데이터베이스에서 가져온 정보가 페이로드에 들어가면 된다.
const accessToken = jwt.sign(Payload, process.env.ACCESS_SECRET);
const refreshToken = jwt.sign(Payload1, process.env.REFRESH_SECRET);
// refreshToken 은 accessToken 보다 유효기간이 더 길게 설정한 Payload1을 넣어줬다.
res.set("Set-Cookie", [`refreshToken=${refreshToken} 쿠키설정주르륵~;`])
res.status(200).json(result);
// 리프레시 토큰은 이런식으로 쿠키에 담았다.
controllers/users/accessTokenRequest.js
에서const authorization = req.headers['authorization'];
// 토큰이 있으면 authorization 에 값이 들어있음
// 토큰 해독하는 법 verify(해독, 검증)
const jwt = require('jsonwebtoken);
const authorization = req.headers['authorization'];
const token = authorization.split(' ')[1];
const data = jwt.verify(token, ACCESS_SECRET);
// 작성한 코드
const jwt = require('jsonwebtoken);
const authorization = req.headers['authorization'];
const token = authorization.split(' ')[1];
const tokenInfo = jwt.verify(token, process.env.ACCESS_SECRET)
console.log(tokenInfo) // 하면 넘겨줬었던 정보들 다 확인가능하다
// 담겨있는 정보를 DB와 조회후 존재하면 정보 넘기기
controllers/users/freshTokenRequest.js
에서const token = req.cookies.refreshToken;
// 이 코드로 쿠키에 리프레시토큰이 들어있는지 확인합니다
jwt.verify(token, process.env.REFRESH_SECRET) // 해독방법 같음
제일 중요한건 정보를 내보낼 때, 비밀번호를 내보내면 절대 안됩니다!
테스트항목에 맞춰서, 상태업데이트하게 연결해주면 된다.
쿠키, 세션 클라이언트와 매우 비슷하다.