Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- jest
- mongoose
- Express
- 자료구조
- 게임
- Nest.js
- dfs
- Bull
- game
- MongoDB
- typeORM
- GIT
- flask
- MySQL
- nestjs
- 공룡게임
- Dinosaur
- JavaScript
- Sequelize
- cookie
- OCR
- AWS
- TypeScript
- nodejs
- class
- 정렬
- react
- Python
- Queue
Archives
- Today
- Total
포시코딩
JWT 본문
728x90
JWT란?
- JSON 형태의 데이터를 안전하게 교환하여 사용할 수 있게 해준다.
- 인터넷 표준으로 자리잡은 규격
- 여러가지 암호화 알고리즘을 사용할 수 있다.
- header.payload.signature의 형식으로 3가지의 데이터를 포함한다.
때문에 JWT 형식으로 변환된 데이터는 항상 2개의 점(.)이 포함된 데이터여야 한다. - JWT는 암호 키(Secret Key)를 모르더라도 복호화(Decode)가 가능하다.
변조만 불가능 할 뿐, 누구나 복호화하여 보는 것은 가능하다는 의미 - 누구나 볼 수 있기 때문에 민감한 정보(개인정보, 비밀번호 등)는 담지 않도록 해야한다.
- 특정 언어에서만 사용 가능한게 아니다.
개념으로서 존재하고, 이 개념을 코드로 구현하여 공개된 코드를 우리가 사용하는게 일반적.
- header: signature에서 어떤 암호화를 사용하여 생성된 데이터인지 표현한다.
- payload: 개발자가 원하는 데이터를 저장한다.
- signature: 이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와준다.
쿠키, 세션과 다른 점
- 데이터를 교환하고 관리하는 방식인 쿠키/세션과 달리, JWT는 단순히 데이터를 표현하는 형식이다.
- JWT로 만든 데이터를 브라우저로 보내도 쿠키처럼 자동으로 저장되지 않지만,
변조가 거의 불가능하고 서버에 데이터를 저장하지 않기 때문에 서버를 Stateless(무상태)로 관리할 수 있고
최근 많이 쓰이는 기술 중 하나이다. - Stateless(무상태)와 Stateful(상태 보존)의 차이를 간단히 설명하자면,
- Node.js서버가 언제든 죽었다 살아나도 똑같은 동작을 한다. -> Stateless
- 반대로 서버가 죽었다 살아났을 때 조금이라도 동작이 다르다. -> Stateful
- 서버가 스스로 어떤 기억을 갖고 다른 결정을 하냐 마냐의 차이로 이해하면 쉽다.
- 로그인 정보를 서버에 저장하게 되면 무조건 Stateful(상태 보존)이라고 볼 수 있다.
사용법
암호화
오픈소스 라이브러리를 이용한다.
npm install jsonwebtoken
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ myPayloadData: 1234 }, // jwt를 이용해 payload 설정하는 부분
"myscretkey" // jwt를 이용해 암호화를 하기 위한 비밀키
);
console.log(token);
app.listen(8080, () => {
console.log("서버가 켜졌어요!");
});
// eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJteVBheWxvYWREYXRhIjoxMjM0LCJpYXQiOjE2NzE0MjY1Njd9.0kkhNtiuMhZUknpcyRsSJsc17nak4l5FWIKzQ-UqLt8
출력된 token을 https://jwt.io/에 가서 입력해보면 아래와 같이 나오게 된다.
이 상태로 우측하단 your-256-bit-secret 부분에 아까 만든 비밀키를 입력하면
암호화 키 인증까지 검증할 수 있다.
복호화
const decodeToken = jwt.decode(token); // jwt의 payload를 확인하기 위해 사용한다.
console.log(decodeToken);
// { myPayloadData: 1234, iat: 1671426989 }
만료기간 설정
const token = jwt.sign(
{ myPayloadData: 1234 },
"mysecretkey",
{ expiresIn: "1s" } // 1초. (String도 가능)
);
데이터 검증
const verifyToken = jwt.verify(token, "mysecretkey");
// 잘못된 키라면 invalid signature라는 에러가 발생한다.
- 암호화를 할 때 사용한 비밀키가 일치하는지 검증
- 해당하는 jwt가 만료되었는지 검증
정리
보통 암호화된 데이터는 클라이언트(브라우저)가 전달받아 다양한 수단(쿠키, 로컬스토리지 등)을 통해
저장하여 API 서버에 요청을 할 때 서버가 요구하는 HTTP 인증 양식에 맞게 보내주어 인증을 시도한다.
- 특정 사용자가 누구인지 확인하기 위해
- 특정 사용자의 대한 권한을 할당하기 위해
결론적으로 사용자에 대한 특별한 정보를 관리하기 위해 많이 사용한다.
728x90
'Node.js' 카테고리의 다른 글
미들웨어(Middleware) (0) | 2022.12.19 |
---|---|
Access Token, Refresh Token (0) | 2022.12.19 |
쿠키(Cookie), 세션(session) (0) | 2022.12.19 |
[Swagger] API 문서 자동화 프레임워크 적용기 (6) | 2022.12.15 |
객체 구조 분해 할당을 통해 req.params 값 쉽게 사용하기 (0) | 2022.12.13 |