JWT의 보안적 고려사항

Jinhyeon Son·2020년 7월 2일
6

개념

목록 보기
23/26

alg : None

JWT 변조 공격으로 가장 흔한것은 Signature Stripping인데 헤더의 alg 클레임을 
None으로 변조하는 공격으로 몇몇 JWT 라이브러리들이 alg가 None인 토큰을 
유효한 토큰으로 인식하는 문제가 있습니다

XSS (Cross Site Scripting)

웹 게시판등의 사용자가 입력한 값이 DB에 저장되고, 프론트엔드 단에 출력하는
구조를 가진 페이지에서 공격자가 <script>태그를 입력함으로서 공격이 성립할 수 있다

이 때 일반 쿠키 또는 세션 스토리지에 저장된 token을 탈취당할 수 있습니다

이를 방지하기 위해 쿠키의 다음과 같은 옵션을 이용합니다

  • HTTP Only : 해당 쿠키를 자바스크립트로 접근할 수 없게하고 HTTP통신으로만 얻을 수 있게 한다
  • Secure Cookie : HTTPS통신에서만 쿠키를 전송한다

CSRF (Cross Site Request Forgery)

유저가 특정 사이트 A의 유효한 쿠키를 가지고있는 상태에서 공격자가 그 쿠키를 이용해
사이트 A에 유효한 요청을 보내는 공격으로 XSS 또는 피싱사이트를 통해
유저가 공격자의 스크립트를 동작시키게되면 현재 브라우저의 쿠키를 이용해서 사이트 A에
접근하여 특정 동작을 수행하는 방식입니다

이를 방지하기 위해 다음과 같은 방법을 사용할 수 있습니다

  • SameSite 쿠키 사용 : 쿠키가 발급된 도메인과 다른 도메인에서 송신되었을 경우(교차 도메인 전송)를 차단하는 SameSite 옵션을 사용합니다
  • refferrer 검증 : 위와 같은 목적이나 서버단에서 직접 HTTP Header의 refferrer를 검증하여
    도메인 일치 여부를 확인하는 방식입니다
  • Double Submit Cookie : 토큰 발급 시 난수를 발생시켜 토큰에 포함하고 토큰 리턴 시 난수를 쿠키에 포함하여 전달하는 방식으로 서버는 토큰 확인 시에 쿠키의 난수값과 토큰의 난수값을 비교하여
    같을 경우에만 요청을 수락합니다. 도메인이 다른 쿠키의 값에 확인, 수정 할 수 없는 Same Origin
    정책으로 인하여 가능한 방법입니다

토큰 하이재킹 대비

short-lived token을 사용할 경우 토큰이 하이재킹 당하더라도
빠르게 만료되어 하이재킹에 대비할 수 있지만
사용자로 하여금 로그인을 자주 하도록 하는 불상사가 발생할 수 있습니다
이에 따라 short-lived token을 사용하기 위해서는
다음과 같은 보완방법이 필요합니다

Sliding Session

글쓰기, 장바구니, 결제 등의 서비스를 이용할 때 중간에 토큰이 만료되지 않도록
특정 페이지에 접속 할 때 또는 클라이언트가 토큰의 iat(토큰 발급 시간) 을 참조해
새로운 토큰을 받아오는 방법

장점

  • 사용자가 로그인을 자주 할 필요가 없다
  • 토큰이 필요한 트랜잭션 도중 토큰이 만료되는 경우를 일부 방지할 수 있다

Refresh Token

사용자가 로그인을 할 때에 다음과 같은 두가지의 토큰을 발급합니다

  • AccessToken : 30분 내외의 짧은 만료 기간을 갖는 실제로 사용자의 인증, 인가에 사용되는 토큰
  • RefreshToken : AccessToken에 비해 긴 만료시간(하루~ 일주일 등)을 갖는 토큰으로
    AccessToken의 재발급에 사용됩니다

클라이언트는 AccessToken이 만료되었다는 오류를 받으면 따로 저장해두었던 RefreshToken을 이용하여 AccessToken의 재발급을 요청합니다. 서버는 유효한 RefreshToken으로 요청이 들어오면 새로운 AccessToken을 발급하고, 만료된 RefreshToken으로 요청이 들어오면 오류를 반환해, 사용자에게 로그인을 요구합니다

AccessToken은 서버에 따로 저장해 둘 필요가 없지만, RefreshToken의 경우 서버의 stroage에 따로 저장해서 이후 검증에 활용해야 합니다. 그러므로 RefreshToken을 이용한다는 것은 추가적인 I/O 작업이 필요하다는 의미이며, 이는 I/O 작업이 필요없는 빠른 인증 처리를 장점으로 내세우는 JWT의 스펙에 포함되지 않는 부가적인 기술입니다

RefreshToken은 탈취되어서는 곤란하므로 클라이언트는 보안이 유지되는 공간에 이를 저장해두어야 합니다

장점

  • 짧은 만료 기간을 사용 할 수 있기 때문에 AccessToken이 탈취되더라도 제한된 기간만 접근이 가능합니다.
  • 사용자가 로그인을 자주 할 필요가 없습니다.
  • 서버에서 RefreshToken를 강제로 만료 시킬 수 있습니다

단점

  • 클라이언트는 AccessToken의 만료에 대한 연장 요청을 구현해야 합니다.
  • 서버에 별도의 storage를 만들어야 합니다.

1개의 댓글

comment-user-thumbnail
2020년 7월 3일

역싀 백엔드 대장님... - addie

답글 달기