[Node.js] #9 JWT

✨New Wisdom✨·2020년 8월 2일
0

📗 Nodejs 📗

목록 보기
10/20
post-custom-banner

https://velopert.com/2350 를 참고하였다.

🚩 토큰 기반 인증

토큰 사용 이유?🙄

  • 서버 기반 인증 (세션 사용)은 유저의 수가 늘어난다면 서버가 과부화 될 수 있다.
  • 세션을 사용하면 분산된 시스템 설계가 더 복잡해진다.
  • 모바일 애플리케이션에서 쿠키 인증시스템 사용은 쿠키 컨테이너를 사용해야해서 번거롭다.
  • 보안성, 무상태 & 확장성 등..

토큰 기반 시스템의 작동 원리

토큰 기반 시스템은 stateless(무상태) 하다. 유저의 인증정보를 서버나 세션에 담아두지 않는다.
1. 유저 로그인
2. 서버측에서 해당 계정정보를 검증
3. 계정정보가 정확하면, 서버에서 유저에게 signed 토큰을 발급
(signed : 해당 토큰이 서버에서 정상적으로 발급된 토큰임을 증명하는 signature 를 지니고 있음)
4. 클라이언트 측에서 전달받은 토큰을 저장해두고, 서버에 요청을 할 때 마다, 해당 토큰을 함께 서버에 전달
5. 서버는 토큰을 검증하고, 요청에 응답


JWT

웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달!

🚩 언제써?

  • 회원 인증
  • 정보 교류 (보안 Good)

🚩 JWT 구조

header.payload.signature

  • Header : typ(토큰의 타입)과 alg(해싱 알고리즘)
{
  "typ": "JWT",
  "alg": "HS256"
}
  • payload : registered(토큰에 대한 정보를 담기 위한 이름이 정해진 클래임), public(충돌이 방지된 이름 : URI), private(양 측간 협의하에 사용되는 클레임)
{
"idx": 2,
"id": "jihye",
"age": 23,
"iss": "duksung",
"exp": "1590937199"
}
  • signature : header의 인코딩 값과 payload의 인코딩 값을 합친 후 비밀키로 해쉬하여 생성
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

🚩 JWT 모듈

jwt.sign(json data, secretKey, [options, callback])

  • 토큰 생성 메소드
  • options에 algorithm(default: HS256), expiresIn, issuer, subject 등을 지정할 수 있다.

jwt.verify(token, secretKey, [options, callback])

  • 토큰 확인 메소드

JWT 모듈 설치

$ npm isntall jsonwebtoken rand-token

🚩 JWT 저장

나는 클라이언트의 cookie에 저장해줄거다.
res 객체를 반환할 때 쿠키에 token 값을 담고 설정한다.

...
res.cookie('accessToken',token,{
            expires: new Date(Date.now() + 604800000), 
            secure: false, 
            httpOnly: true,
          });
...
profile
🚛 블로그 이사합니다 https://newwisdom.tistory.com/
post-custom-banner

0개의 댓글