크로스 사이트 스크립팅(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가 아닌) 토큰의 블랙리스트를 저장한다.
이 2가지 경우에 Token을 BlackList로 추가하면 JWT로도 로그아웃일때 만료를 시키는 효과를 볼 수 있습니다!!