-
[TIL] 스파르타) Node.js 숙련주차 강의 수강 - 3일 차 (JWT)TIL-sparta 2024. 5. 22. 12:40
> Node.js 숙련주차 강의를 수강하고 JWT가 무엇인지 정리해보았다. 조퇴를 하게 되어 간결하게 작성했는데, 추후 내용을 보강하도록 해야겠다.
학습 키워드: JWT, javascript, arrow function
1. JWT
1) What is it?:
JWT는 JSON Web Token 의 약자로, 두 파티 간의 JSON 객체를 통한 안전한 정보 전송을 위한 표준이다. Header, payload, signature 의 세 파트가 점( "." )으로 구분되어 합쳐져 있고, signature 부분에 해싱된 값이 들어있어 서버에서 이를 이용해 토큰의 유효성을 검증할 수 있는 방식이다.
2) How does it work?:Header: 토큰 타입(typ)과 signature에 사용된 알고리즘(alg)이 정의되어 있다.
Payload: 실제 전달되는 데이터를 담고 있다. 암호 키를 모르더라도 토큰을 가지고 있다면 누구나 복호화할 수 있다. 따라서 민감한 정보(개인 정보나 비밀번호 등)는 담으면 안된다.
Signature: 가장 중요한 부분인데, 헤더와 페이로드를 "."으로 구분하여 합친 뒤 서버에서 관리하는 secret 키를 추가해서 서명을 생성한다. 토큰의 위조/변조를 막기 위한 장치다.
3) Javascript example:# yarn을 이용해 프로젝트를 초기화합니다. yarn init -y # jsonwebtoken, express 라이브러리를 설치합니다. yarn add jsonwebtoken express
JWT는 단순히 개념으로만 존재하는 데이터 형식이므로, 직접 implement하여 사용할 수도 있고 JS외의 언어에서도 사용할 수 있다. Node.js 에서는 이를 구현한 jsonwebtoken이라는 공개 패키지가 있다.
import jwt from 'jsonwebtoken'; const token = jwt.sign({ myPayloadData: 1234 }, 'mysecretkey'); console.log(token); // . 으로 구분된 토큰이 출력된다
jsonwebtoken 패키지에는 sign이라고 하는 method가 있다. 두 개의 인자를 받는데, 첫 번째는 payload 데이터를, 두 번째는 서명에 사용될 비밀 키를 넘겨주면 이를 기반으로 token이 생성되는 간단한 구조로 이루어져 있다. 예시에는 추가하지 않았지만, 세 번째 인자로 만료 기간이나 해싱 방식 등 여러가지 옵션을 추가해줄 수 있다. 옵션으로 알고리즘을 명시하지 않았다면 기본 값으로 HS256 방식이 사용된다.
jwt.verify(token, secretKey, (err, decoded) => { if (err) { console.log('Token verification failed:', err.message); } else { console.log('Decoded payload:', decoded); } });
토큰을 검증할 때는 verify를 사용한다. 검증에 성공하면 callback의 두 번째 인자로 decode 된 payload에 접근할 수 있다. 검증에 실패하는 경우 첫 번째 인자로 에러가 반환된다.
import jwt from 'jsonwebtoken'; const token = req.cookies.access_token; // access_token 부분이 res.cookies에서 넘겨준 토큰의 이름이다 const decodedValue = jwt.decode(token); console.log(decodedValue); // 복호화 된 서명의 payload
검증 없이 복호화 할 때는 decode method를 사용한다. 만약 토큰이 쿠키에 담겨있었다면, cookie-parser 미들웨어를 사용하면 req.cookies에 res.cookies에서 넘겨줬던 토큰 이름과 동일한 이름을 key로 가지는 토큰이 넘어온다.
4) Why use it?:
앞서 말했듯이 JWT 토큰은 해싱 처리된 서명이 있어서 변조가 어렵기 때문에 ID token과 같은 형태로 인증 및 인가를 구현하기에 알맞다. 게다가 서버에서 객체를 생성하거나 하지 않기 때문에 stateless 한 상태를 유지할 수 있어서 세션의 stateful한 방식에서 발생하는 메모리 문제에서도 자유롭다.
--
REFERENCES:
> Node.js 숙련주차 강의 노트, JWT
> auth0.com, "JSON Web Tokens"
728x90'TIL-sparta' 카테고리의 다른 글
[TIL] 스파르타) 아이템 시뮬레이터 2 과제 진행 - 3일 차 (bcrypt) (0) 2024.05.24 [TIL] 아이템 시뮬레이터 2 과제 시작 - 1일 차 (관계형 DB로 전환하기) (0) 2024.05.23 [TIL] 스파르타) Node.js 숙련주차 강의 수강 - 2일 차 (Cookie, Session) (0) 2024.05.21 [TIL] 스파르타) Node.js 숙련주차 강의 수강 (AWS RDS, Prisma) (0) 2024.05.20 [TIL] 프로그래머스) 76502 - 괄호 회전하기 (0) 2024.05.19