1. JWT이란?
JWT Token 이란 JSON Web Token의 줄임말로 말 그대로 JSON 데이터를 가지는 토큰이다. 헤더, 페이로드, 시그니처로 이루어져 있습니다.
- 헤더 - 보통 헤더는 해당 토큰의 타입과 토큰을 암호화한 해싱 알고리즘의 종류를 포함하고 있습니다. 보통 RSA나 HS256을 사용하여 암호화 한 후에는 BASE64로 인코딩 됩니다.
- 페이로드 - 페이로드에는 토큰 발급시 넣는 정보를 담는 부분입니다. 예를 들어 유저의 아이디나 이메일 등 토큰의 발급대상을 알 수 있는 정보를 넣는 것이 일반적입니다.
- 시그니처 - 토큰이 중간에 변경이 되었는지 확인시 사용되는 부분으로 헤더의 인코딩 값, 페이로드 인코딩 값, 비밀 키를 가지고 해싱 알고리즘을 거쳐 만들어집니다. 이 시그니처를 이용하여 토큰의 무결성 여부를 검증합니다.
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
위 링크로 가면 JWT의 구조를 볼 수 있고 실제 JWT 값을 사용 알고리즘과 비밀 키만 알면 복호화 할 수도 있습니다. 그리고 해당 페이지는 JWT의 공식 문서이기 때문에 한번 보는 것도 추천드립니다.
2. JWT의 장점과 단점
장점
- JWT는 토큰 자체에 사용자의 정보나 인증과 관련된 데이터들이 있기 때문에 데이터베이스에 저장을 하거나 조회를 할 필요가 없습니다. 그에 따라 서버에서의 리소스 사용량이 줄어들기 때문에 부하가 줄어드는 장점을 가지고 있습니다.
- 비밀 키를 사용하여 서명하는 방식이기 때문에 비밀 키만 유출이 되지 않는다면 토큰의 무결성을 보장할 수 있습니다.
- 서버 측에서 정한 방식으로 토큰이 만들어져 사용자가 저장했다가 사용되는 방식이기 때문에 사용자의 플랫폼에 상관없이 사용될 수 있습니다. 이러한 특성으로 인하여 모바일에서도 잘 적용됩니다.
- JWT는 보통 http의 헤더에 포함되어 전송되기 때문에 요구되는 트래픽이 크지 않습니다. 또한 http헤더에 포함되면 cors 문제에 대해 자유롭다는 장점도 가지고 있습니다.
단점
- JWT는 개발자가 마음대로 포함될 정보를 정할 수 있으므로 넣는 정보의 양에 따라 오히려 트래픽이 늘어날 수도 있습니다.
- 또한 개발자가 넣은 정보는 단지 base64로 인코딩되어 있기때문에 쉽게 내용을 알 수 있습니다. 고로 민감한 정보는 넣지 않아야 합니다.
- 비밀 키가 유추하기 쉬운 경우나 유출된 경우 보안에 위협이 될 가능성이 있습니다. 고로 비밀 키는 유추하기 어려운 값을 사용하고 유출에 대비하여야 합니다.
- 옵션에 따라 다르지만 악의적인 사용자가 토큰의 내용을 변경하여 해당 사용자인 척 행동 할 수도 있고 특히 중간자 공격(Man-in-the-Middle Attack)에 취약하다는 단점이 있습니다.
정리
JWT는 토큰 자체로 사용자를 인증 할수 있으며 그 크기도 대체적으로 작고 유저가 저장하기 때문에 트래픽과 같은 성능적인 측면에서 좋은 점이 있습니다. 하지만 보안적인 측면에서 중간자 공격에 대한 취약점이 분명 존재하기 때문에 이를 해결하기 위한 방식을 적용해야합니다.
다음 글에서는 JWT의 기본적인 사용 방식과 access token과 refresh token으로 나누어 사용하는 방식에 대해서 알아보겠습니다.
'Node.js(Express)' 카테고리의 다른 글
| [Node.js] SNS 만들기 - Nodemailer를 이용한 사용자 인증 (0) | 2024.01.22 |
|---|---|
| [Node.js] JWT 사용하기 - access token, refresh token (0) | 2024.01.20 |
| [Node.js] SNS 만들기 - Controller 만들기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - Model 만들기 (0) | 2024.01.18 |
| [Node.js] SNS 만들기 - 라우터 만들기 (1) | 2024.01.13 |