JWT(Json Web Token)
문서에 따르면 JWT는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 독립적인 방법을 정의하는 개방형 표준이라고 한다. session과 같이 인가에 필요한 요소이다.
JWT의 구성 요소는 header, payload, signature 이루어져 있으며 ‘.’을 기점으로 나눠져 있다.
디코딩된 JWT는 오른쪽과 같은 구조를 지닌다.
header
header는 일반적으로 토큰 유형(JWT)과 사용되는 서명 알고리즘(예: HMAC SHA256 또는 RSA)의 두 부분으로 구성된다.
alg 는 사용되는 암호화할 서명 알고리즘으로 보통 HS256을 사용하며 RSA도 사용할 수 있다고 한다.
HS256**(HMAC with SHA-256)**은 header와 payload를 base64로 incoding(암호화)하고 signature은 header.payload.비밀키로 해싱한 값이다.
RSA는 signature를 빼고 header와 payload 값을 base64로 incoding하고 서버 개인키로 잠궈 사용한다.
payload
직관적으로는 통신 정보를 담고 있다고 생각하면 된다. 사용자를 식별할 수 있는 값과 유효 기간 등이 포함된다. 해당 값을 claim이라고 한다.
필요한 claim이 있다면 직접 추가할 수 있다.
signature
위 사진과 같이 header와 payload는 단순히 인코딩된 값이므로 base64로 디코딩하면 해당 내용을 확인하거나 수정할 수 있다. 하지만 signature은 header와 payload를 더해 서버에서 지정한 비밀키를 조합한 것이므로 비밀키를 모르는 다른이는 복호화할 수 없다. 따라서 signature는 토큰의 변조 여부를 확인하는데 사용된다.
만약 토큰이 탈취된다면 header, payload는 누구나 볼 수 있기에 header, payload에는 비밀번호와 같이 중요한 보안 요소는 존재하면 안 된다. 예를 들어 유출되어도 큰 문제가 없는 아이디와 같이 고유 식별 값은 claim으로 존재해도 된다.
SESSION과 다른 JWT의 장점과 단점은?
장점
- Signature로 인해 데이터 위변조를 막을 수 있다.
- JWT 자체가 정보를 담고 있으므로 인증 정보에 대한 별도 저장소가 없다.
- 토큰에 여러 값을 넣을 수 있으므로 확장성이 우수하다.
단점
- 무상태성으로 인해 토큰을 탈취 당하면 대처하기 어렵다. 해커가 토큰을 탈취했다면 해당 토큰 사용자의 권한을 얻는 셈이다.
- 토큰이 길이가 session보다 상대적으로 길어 인증 요청이 많다면 네트워크 부하가 심해진다.
SESSION과 JWT 어느 것을 써야 할까?
현재 상황에 맞게 사용하면 된다. 예를 들어 은행은 보안이 절대적이다. 해커가 다른 사람에 권한을 얻게 된다면 해당 사람의 계좌는 전부 털릴 것이다. 이와 같은 경우에는 상대적으로 JWT보단 SESSION이 안전할 것이다.
따라서 각 서비스 상황에 맞게 선택해서 사용하면 된다.
참조
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
https://tecoble.techcourse.co.kr/post/2021-05-22-cookie-session-jwt/
인증 방식 : Cookie & Session vs JWT
1. HTTP 특성 HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜입니다. 클라이언트가 서버에게 요청을 보내면 서버는 응답을 보냄으로써, 데이터를 교환합
tecoble.techcourse.co.kr