4. JWT (JSON Web Token)
* JWT 구조와 장단점
JWT는 웹에서 사용자 인증을 위해 JSON 형식으로 암호화된 토큰을 의미합니다. header, payload, signature로 구성되며, 기존 세션 방식과는 다르게 stateless하다는 특징이 있습니다.
Payload는 JSON 형식의 데이터로, 토큰을 누가 누구에게 발급했는지, 언제까지 유효한지 등의 정보를 담고 있으며 이렇듯 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 합니다.
Header와 Signature는 payload 변조를 막기 위해 존재하며 header에는 토큰의 타입과 알고리즘 종류, signature에는 토큰의 헤더, 그리고 서버에 감춘 비밀 값으로 암호화한 값을 저장합니다.
JWT 방식은 세션과 다르게 사용자들의 상태를 저장할 필요 없이 요청이 들어올 때마다 서버의 비밀값으로 확인해주면 되기 때문에 서버의 메모리 용량 문제를 겪지 않습니다. 하지만 해커에게 토큰을 탈취 당할 경우 서버가 사용자의 상태를 기억하고 있지 않기 때문에 대상의 상태를 제어하지 못하기 때문에 토큰을 무효화할 방법도 없습니다.
* JWT 유효성 검사 (JWT validation)
JWT 유효성 검사는 토큰에 포함된 정보가 간섭받고, 검증된 소스로부터만 비롯되도록 보장하여 토큰의 무결성과 원본임을 보장하는 중요한 과정입니다.
* JWT 유효성 검사 과정
1. JWT 복호화 : JWT 검증 과정은 JWT를 복호화(decode)하는 것에서부터 시작됩니다. JWT를 그 구성요소인 header, payload, 그리고 signature로 분리하여 각 섹션에 저장된 정보들을 확인합니다.
2. Signature 확인 : 복호화 후, 토큰 암호화에 사용된 비밀키 혹은 공개키를 사용하여 header와 payload의 정보를 통해 signature를 검증합니다.
3. Claim과 만료기간 확인 : signature가 검증된다면, payload 내부의 claim을 검사하여 해당 토큰이 필수적인 정보를 포함했는지, 그리고 요구 기준을 충족했는지 검사합니다. 또한 만료 시간을 넘기지 않았는지도 확인합니다.
4. 발급자와 대상 확인 : 앱 요구사항에 따라, JWT는 의도된 대상자와 발급자인지를 검증하여 적합한 상황과 신뢰성 있는 기관으로부터 발급되었는지 확인합니다.
5. 토큰 폐지 : 토큰이 재발급되거나 유효하지 않는지, 특히 토큰이 블랙리스트에 등록되지는 않았는지 혹은 기본 만료시간 전에 재발행되지 않았는지 확인합니다.
6. 적절한 보안 측정 수행 : 안전한 전송을 위한 HTTPS 적용, 비밀키와 민감한 정보에 대한 보안적인 스토리지를 채택하여 보안을 적용합니다.
* Access Token과 Refresh Token
refresh token은 JWT 토큰의 근본적 문제점인 access token 탈취 문제를 해결하기 위한 것으로, access token의 수명을 몇 시간이나 몇 분 이하로, refresh token의 수명을 하루에서 2주 정도로 길게 구성하는 방식입니다.
최초 사용자 로그인 시 access token과 refresh token을 발급하여 클라이언트에게 전송하고 서버는 refresh tokne 값을 DB에 저장하여 후에 사용자의 access token 수명이 만료될 때마다 refresh token을 토대로 새 access token을 발급 받는 방식으로 구현할 수 있습니다. 만약 토큰 탈취가 의심 된다면 DB에 저장된 refresh token을 삭제하여 더 이상 토큰 갱신이 불가능하도록 하여 관리할 수 있습니다.
Q. JWT, Refresh Token, Access Token에 대해 설명해주세요.
Json Web Token은 웹에서 사용자 인증을 위해 사용하는 Json 형식으로 암호화된 토큰을 의미하며, header / payload / signature로 구성되었습니다. 기존 세션 방식과는 다르게 상태를 저장하지 않는다는 특징이 있습니다.
Refresh Token은 Access Token 탈취 문제를 해결하기 위한 방법입니다.
최초 토큰 발행 시 Access Token과 Refresh Token의 2가지 토큰을 발급하고, 이를 로컬 스토리지, 세션 스토리지, 쿠키 등에 저장하여 이를 통해 요청 시마다 사용자 인증/인가를 수행합니다. Access Token은 탈취 당할 위험이 있어 유효기간을 짧게 설정하고 유효기간이 지나면 Refresh Token이 아직 유효하다면 새로운 Access Token을 발급받아 사용하며, 모든 토큰이 만료된다면 Access Token과 Refresh Token의 두 토큰을 모두 폐기하고 새로운 토큰을 받아 보안성을 강화할 수 있습니다.
Q. JWT와 세션 기반 인증 방식의 차이점에 대해 설명해주세요.
세션 기반 인증은 서버 측에서 상태를 유지하는 반면, JWT는 클라이언트 측에서 상태를 유지합니다. 또한 JWT는 확장성이 높고 여러 도메인과 서비스 간에 쉽게 공유할 수 있습니다. 그러나 쿠키와 세션에 비해 보안적인 취약점이 있습니다.
'CS' 카테고리의 다른 글
[CS] HTTP와 HTTPS (0) | 2023.11.30 |
---|---|
[CS] 쿠키 vs. 세션 vs. 토큰 (1) | 2023.10.27 |