목차
1. JWT란?
2. 토큰의 유형
3. 어떻게 생겼을까?
4. 토큰 생성
5. 쿠키를 사용한다고?
1. JWT란?
- Json Web Token
- 권한 인증을 위해 유저의 정보를 SHA-256 해시알고리즘으로 암호화한 값으로 권한인증을 하는 토큰 기반 인증 방식
기존의 권한인증은 세션 정보를 서버에 저장하여 사용자가 요청할 때 헤더에 포함된 세션을 비교하여 인증을 하는 방식이였다. 하지만 이는 세션 정보가 많아짐에 따라 서버에 부담을 줄 수 있다. 하지만 토큰은 서버가 아닌 클라이언트가 토큰을 가지고 있도록 하여 서버에 부담을 줄여줄 수 있다.
2. 토큰의 유형
토큰은 사용 목적에 따라 2가지가 있다.
- Access Token
▶ 서버에 통신할 때 권한 인증을 위해 사용되는 토큰으로 짧은 유효시간을 갖는다. 유효시간이 짧다고 해서 무조건 계속 로그인을 해주어야 하는 것은 아니고 이미 인증이 된 사용자라면 Refresh token에 의해 계속 token을 재발급받는다.
- Refresh Token
▶ Access Token을 재발급하기 위한 토큰으로 며칠, 몇 개월 단위로 유지된다. Access Token이 만료되었을 때 Refresh token에 의해 재발급이 된다. 하지만 Refresh token도 만료가 되면 반드시 다시 권한 인증을 위해 로그인을 해야 한다.
3. 어떻게 생겼을까?
토큰은 header, payload, signature로 나누어지며 "."으로 구분된다.
header | payload | signature |
타입과 암호 알고리즘의 정보 | 검증할 유저의 정보 및 발금,만료시간 등을 포함 | 전자서명 |
4. 토큰 사용하기
토큰은 외부 모듈이므로 설치를 해야 사용이 가능하다.
1 ) 토큰 생성
토큰에는 패스워드 등의 민감한 정보 대신 유저의 ID나 이름같이 유출이 되도 크게 상관이 없는 정보를 포함시키는 것이 좋다.
또한 토큰을 생성할 때 필요한 비밀키는 본인만 알아야하기에 환경변수로 저장하여 사용하는 편이 좋다.
const jwt = require("jsonwebtoken");
const key = "비밀키";
jwt.sign({
type: "JWT",
name: "kim"
}, key, {
expiresIn: "5m",
issuer: "발급자"
});
2 ) 토큰 복호화
const jwt = require("jsonwebtoken");
const token = "복호화할 토큰값";
const key = "비밀키";
jwt.verify(token, key);
5. 쿠키를 사용한다고?
JWT는 쿠키에 암호화한 토큰값을 저장하고 요청을 했을 때 해당 토큰을 검증하여 사용자의 권한 유무를 판별한다. 그런데 정보가 유출될 수 있다는 쿠키를 사용한다니? 뭔가 문제가 있어보인다. 쿠키를 조작하여 토큰을 변조하게 되면 정상적인 사용자라도 문제가 생길 수 있다.
하지만 브라우저에서 해당 토큰을 다루지 못하게 하는 방법이 있다.
res.cookie("token", token, { httpOnly: true });
서버에서 토큰을 발급하여 쿠키에 저장하여 응답할 때 httpOnly라는 옵션을 true로 지정하면 요청과 응답에만 사용하고 클라이언트가 직접 토큰을 조작할 수 없다.
'NodeJS' 카테고리의 다른 글
웹소켓 (0) | 2024.06.30 |
---|---|
Sequelize (0) | 2024.06.29 |
내 비밀번호 나도 모르게 만드는 법 bcrypt (0) | 2024.06.22 |
cors (0) | 2024.06.21 |
form태그로 REST FUL 가능할까? (0) | 2024.06.15 |