메뉴 닫기

JWT에 관한 5가지 사실

JWT는 세션을 대체한다

사용자가 올바른 자격 정보를 서버에 보낼 때 기존의 세션 방식의 경우 서버에 세션을 만들고 쿠키를 반환받는다면 JWT는 이 세션을 대체해 서버에서 비밀키로 사인한 JSON 웹 토큰을 반환해 이를 로컬에 저장한다. 저장할 때는 로컬 스토리지, 쿠키 등을 활용한다.

JWT는 머리, 가슴, 배로 나뉜다

JWT는 마침표(.)를 기준으로 헤더, 페이로드, 서명 3부분으로 나뉘며, 각각의 부분은 base64로 인코딩된다.
헤더는 서명에 사용된 알고리즘을 명시하고 있으며, 페이로드는 원하는 정보를 담을 수 있고, 서명은 헤더+페이로드를 인코딩하여 서버가 가지고 있는 시크릿 키를 통해 암호화한 것이며 토큰이 유효한지 검사할 때 사용된다.

JWT는 탈취에 취약하다

JWT의 단점은 세션과는 달리 한 번 발급된 토큰을 무효화시킬 수 없다는 것이다. 즉 취약점을 활용하여 로컬 스토리지나 쿠키에 접근하여 JWT를 탈취한다면 이것의 접근을 차단할 방법이 없다. 탈취된 토큰이 만료되기를 기다리는 수밖에.

JWT로 JWT를 갱신할 수 있다

앞서 말했듯 JWT는 탈취에 취약하다. 그래서 이를 보완하기 위해 액세스 토큰과 리프레시 토큰, 2개의 토큰을 사용하는 방법이 있다. 처음 토큰을 발급받을 때 유효 기간이 짧은 액세스 토큰과, 유효 기간이 긴 리프레시 토큰을 같이 발급받는다. 액세스 토큰의 유효 기간이 끝나기 전까지는 액세스 토큰만 사용하여 요청을 인증한다. 만약 액세스 토큰이 만료되어 인증이 실패한다면? 그 때 액세스 토큰과 리프레시 토큰을 같이 담아 요청을 보내면 응답과 함께 새로운 액세스 토큰을 발급해준다.

JWT는 프론트엔드에서 payload를 디코딩하여 활용할 수 있다

만약 페이로드에 사용자 이름 등을 담아서 보낸다면, 프론트엔드에서 백엔드와 통신하지 않고도 사용자 정보를 표시하는 데에 활용할 수 있다. 그만큼 서버의 자원이 절약되는 셈이다. 헤더와 페이로드는 비밀키로 암호화하지 않고 base64 인코딩만을 거치기 때문에 프론트엔드에 비밀키가 노출되지 않아도 디코딩하여 활용할 수 있다.

다만 페이로드 데이터를 활용하는 것은 정보를 실시간으로 얻기 힘들다는, 즉 이미 만료된 데이터가 들어 있을 수도 있다는 문제도 있으므로, 실시간 데이터가 아니어도 괜찮은지 여부를 판단하여 신중하게 결정해야 한다.

Posted in 개발

댓글 남기기