[2/2 JWT로 보안수준 높이기] JWT를 Stateful하게?

BlackBean99·2022년 9월 7일
19

Server

목록 보기
2/2
post-thumbnail

XSS공격이란

크로스 사이트 스크립팅(Cross Site Scripting, XSS)은 공격자가 상대방의 브라우저에 스크립트가 실행되도록 해 사용자의 세션을 가로채거나, 웹사이트를 변조하거나, 악의적 콘텐츠를 삽입하거나, 피싱 공격을 진행하는 것을 말합니다.

이런 공격을 통해 로컬 스토리지에 저장된 Cookie, Session 것들을 탈취당할 수가 있습니다.

10가지 웹 애플리케이션 보안 취약점 목록인 OWASP Top10에 포함되어 있을 정도로 자주 발생하는 공격입니다.


이런 XSS공격을 통해서 토큰을 탈취할 수가 있어 OWASP 에 Top 10으로 올라왔죠

이때 JWT의 리프레쉬토큰은 Stateful토큰이라는점.
그래서 XSS를 통해 RefreshToken을 탈취당하면 바로 JWT를 생성할수 있습니다.

Session은 httpOnly 옵션을 걸어서 XSS 를 쉽게 막을 수 있지만, 로컬스토리지 넣는것 자체가 자바 스크립트로 크로스사이트스크립팅으로 공격할 수가 있어버립니다.


조치 방안

  • JWT BlackList 를 구현하여 같이 운영함으로써, 서버에서 Token에 대한 제어를 수행할 수 있도록 구현

  • JWT Payload 내 stateful한 token을 추가하여, 서버에서 stateful token을 통해 제어를 수행할 수 있도록 구현한다.

  • Token에 대한 유효성 검증 로직 추가됨에 따라 기존 JWT에 비하여 서버 부하가 조금은 증가하겠지만? Stateful token만을 이용한 방식보다는 여전히 부하가 적다. ( 성능 향상 조금? )

새로운 인증과정

그럼 인증 과정을 JWT에서 한다구요? JWT스럽지 못한데요? (개발자 개그, Restful하지 못한데요?ㅋㅋㅋ)


죄송합니다.

네 그럴려고 일부만 Stateful 하게 설계하는 것이니까요.
그 과정을 그림으로 표현하면

Redis와 같은 저장 Storage를 사용하여(브라우저 내에 Local Storage가 아닌) 토큰의 블랙리스트를 저장한다.

  1. 로그인을 하여 id, pw를 서버에 전송한다.
  2. 서버에서 JWT 토큰을 생성해서 Client에 제공
  3. Client에서 특정기능을 실행할때 토큰을 서버에 전송함
  4. Redis와 같은 Storage에 등록된 BlackList에서 만료된 토큰인지 조회한다 ( 인증 )
  5. BlackList가 아닌 토큰인 경우 결과를 제공해주고 아닌경우 결과를 제공해주지 않는다.

BlackList 기준

  • 로그아웃 했을때
  • 임의로 만료시키고 싶을때

이 2가지 경우에 Token을 BlackList로 추가하면 JWT로도 로그아웃일때 만료를 시키는 효과를 볼 수 있습니다!!

Reference

배달의민족 8월세미나

profile
like_learning

0개의 댓글