JWT 보안

김석규·2022년 12월 27일
0

JWT

JWT는 신원(Identity)정보와 클라이언트의 요청과 관련된 정보를 운반하는데 사용된다. 이 컨테이너는 서버에 의해 서명되며 클라이언트의 조작을 방지한다.

토큰은 인증을 통해 생성되고, 서버에 의해 검증된다. 이 과정이 비상태성을 유지하며 이루어지기 때문에 클라이언트와 서버의 분리가 용이하다.

JWT는 헤더, 페이로드, 시그니처 3영역으로 구분되는데, 헤더영역은 암호화한 알고리즘과 유형을 담고있고, 페이로드 영역은 내용을 담고있다. 시그니처 영역은 헤더와 페이로드의 위변조 여부를 검증하기 위한 것이다.

헤더와 페이로드는 단지 JSON문자열을 base64로 인코딩한 것이기 때문에 간단히 확인이 가능하다. 그래서 헤더와 페이로드를 이어붙이고 비밀키로 암호화하여 비밀키를 가지고있는 서버가 위변조를 확인할 수 있게 한다.

토큰에 대한 공격과 예방

None 해싱 알고리즘.

몇몇 라이브러리는 none 알고리즘으로 서명된 토큰을 유효한 토큰으로 인식하는 경우가 있다.

알고리즘 사용에 대한 인가되지 않은 제어를 막기 위해선 명시적으로 HMAC-256 해싱 알고리즘 사용을 선언한다.

토큰 하이재킹

공격자에 의해 토큰이 중간에 가로채지거나 도난당하면 시스템에 대한 접근권한을 얻기 위해 악용될 수 있다.

방어하기 위해선 사용자 컨텍스트를 토큰에 생성한다. 보안설정을 갖추고 무작위 문자열을 컨텍스트로 삼아, 토큰 유효성 검증시 수신된 토큰이 올바른 컨텍스트를 포함하는지 확인한다.

사용자에 의한 명시적 토큰 철회/취소

JWT의 고유한 문제이다. 토큰은 만료될때까지 유효하며 사용자는 명시적으로 토큰의 유효성 검증을 취소할 수단이 없다. 이는 토큰이 유출 될 경우 사용자는 토큰 자체를 취소하여 공격자를 차단할 수 없음을 의미한다.

토큰의 블랙리스트를 구현하여 logout 기능을 모방하는데 사용하는 것으로 보호할 수 있다. 블랙리스트는 토큰의 헥사로 인코딩된 SHA256 다이제스트와 취소일자를 함께 보관한다. 이 기간동안 유효성보다 상위의 우선순위를 가진다.

사용자가 로그아웃을 원할 때 지정된 서비스가 호출되면 제공된 사용자 토큰을 블랙리스트에 넣어둔다. 그리고 나중에 어플리케이션에서 사용시 토큰을 말소시킨다.

토큰 정보 노출

공격자가 토큰에 접근하여 정보를 추출하는 방식이다. 이는 시스템에 대한 정보를 얻기 위한 방법으로, 정보의 예는 보안 권한, 로그인 유형 등이 있다.

토큰을 대칭키 알고리즘을 통해 암호화하여 보호한다. 암호화는 내부 정보를 감추는 수단으로 사용된다. 그러나 JWT토큰을 변조하는데 첫번째 방어수단은 시그니처이며, 시그니처와 유효성검증은 언제나 준비되어 있어야 한다.

토큰의 약한 암호화 키

암호화키가 HMAC SHA256알고리즘에 사용되고 이 해시 값이 토큰 시그니처에 사용되는 경우 암호화키가 취약하다면 bruteforcing(무차별 대입 공격)의 위협에 노출 될 수 있다.

알파벳+숫자+특수문자 문자열로 암호화키의 강도를 높인다.

출처

JWT payload (claims, body) 부 암호화 및 복호화 방법

profile
백엔드 개발자 지망생

0개의 댓글