[TIL_2023.11.07] Node.js - JWT 정리

김효진·2023년 11월 7일
0

JWT란?

  1. json 형태의 데이터를 안전하게 교환하여 사용할 수 있게 해주는 인터넷 표준으로서 자리잡은 규격으로 여러가지 암호화 알고리즘을 사용할 수 있다.

  2. header.payload.signature 의 형식으로 3가지의 데이터를 포함한다. (항상 2개의 ' . ' 이 포함됨)

    1) header(머리)는 signature(배)에서 어떤 암호화를 사용하여 생성된 데이터인지 표현합니다.
    2) payload(가슴)는 개발자가 원하는 데이터를 저장합니다.
    3) signature(배)는 이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와줍니다.

  3. 비밀 키를 모르더라도 복호화가 가능해(변조는 x) 누구나 복호화 하여 볼 수 있으므로 민감한 정보를 담으면 안됨.

  4. 쿠키, 세션은 데이터를 교환하고 관리하는 방식인데 반해 JWS는 단순히 데이터를 표현하는 방식이다.

  5. 데이터를 브라우저로 보내도 쿠키처럼 자동 저장되지는 않으나, 변조가 거의 불가능하며 서버에 데이터를 저장하지 않는 이유로 서버를 stateless(무상태) 상태로 관리할 수 있어 최근에 많이 쓰이는 기술중 하나
    -> Node.js 서버가 언제든 죽었다 살아나도 똑같은 동작을 하면 Stateless하다 표현, 반대로 로그인 정보 등의 데이터를 서버에 저장하게 되면 무조건 stateful 상태!

    사용하는 라이브러리 -> npm: jsonwebtoken

JWT 왜 사용하는가?

  1. JWT가 인증 서버에서 발급되었는지 위변조 여부를 확인할 수 있다.
  2. 누구든지 JWT 내부에 들어있는 정보를 확인할 수 있다. (복호화)

암호화 된 데이터는 어떻게 쓸 수 있는지?

보통 암호화 된 데이터는 클라이언트(브라우저)가 전달받아 다양한 수단(쿠키, 로컬스토리지 등)을 통해 저장하여 API 서버에 요청을 할 때 서버가 요구하는 HTTP 인증 양식에 맞게 보내주어 인증을 시도한다.

장점 / 단점

<장점>

  1. header.payload.signature 의 형식 -> 데이터 위변조를 막을 수 있다.
  2. 쿠키와 달리 토큰을 기반해 다른 로그인 시스템제 접근 및 권한 공유가 가능하다.
  3. 세션과 달리 인증정보를 저장하지 않아 서버를 stateless(무상태) 상태로 관리 -> 서버 확장성 우수해질 수 있음
  4. 인증 정보에 대한 별도의 저장소가 불필요 -> 서버 자체보다도 데이터 베이스 포화로 서버가 함께 죽는 경우가 많아 db 조회를 안해도 된다는 것은 큰 장점!

<단점>

  1. 토큰 자체에 정보를 담고 있다는 사실이 양날의 검 -> 토큰 자체를 탈취당하면 대처하기가 어렵게 된다.(stateless 특징과도 연결)
  2. 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다. -> 토큰의 Payload에 3종류의 클레임을 저장하기 때문
  3. payload는 BASE64로 인코딩 된 것(암호화x)이기 때문에, Payload를 탈취해 디코딩하면 데이터를 볼 수 있다 -> payload에 중요한 데이터 넣지 않도록 주의!

-> 물론 이런 단점을 보완하기 위해 현업에서는 Access Token, Refresh Token 이렇게 이중으로 나누어 인증하는 방식을 취한다.

-> Access Token은 접근에 관여, Refresh Token은 재발급에 관여하는 역할의 JWT 이라고 말할 수 있다.

profile
더 많은 사람들이 더 좋은 정보와 서비스를 누릴 수 있게!!

0개의 댓글