클라이언트 컴퓨터에 JWT를 저장해야합니다. LocalStorage / SessionStorage에 저장하면 XSS 공격으로 쉽게 잡을 수 있습니다. 쿠키에 쿠키를 저장하면 해커가 CSRF 공격에서 쿠키를 읽고 (읽지 않고) 사용자를 가장하고 API에 연락하여 조치를 취하거나 사용자 대신 정보를 얻기위한 요청을 보낼 수 있습니다.
그러나 쿠키에서 JWT를 안전하게 도난 당하지 않도록 보호하는 방법에는 여러 가지가 있습니다 (그러나 여전히 도용하는 고급 기술이 있습니다). 그러나 LocalStorage / SessionStorage에 의존하고 싶다면 간단한 XSS 공격으로 액세스 할 수 있습니다.
CSRF 문제를 해결하기 위해 신청서에 이중 제출 쿠키를 사용합니다.
이중 제출 쿠키 방법
JWT를 HttpOnly 쿠키에 저장하고 보안 모드에서 사용하여 HTTPS를 통해 전송하십시오.
대부분의 CSRF 공격에는 요청시 원래 호스트와 다른 원본 또는 참조 헤더가 있습니다. 헤더에 포함되어 있는지 확인하십시오. 도메인에서 오는지 여부입니다! 거부하지 않으면. 요청에서 출발지와 리퍼러를 모두 사용할 수없는 경우 걱정할 필요가 없습니다. 다음 단계에서 설명하는 X-XSRF-TOKEN 헤더 유효성 검사 결과에 의존 할 수 있습니다.
브라우저가 요청 도메인에 쿠키를 자동으로 제공하지만 한 가지 유용한 제한이 있습니다. 웹 사이트에서 실행되는 JavaScript 코드는 다른 웹 사이트의 쿠키를 읽을 수 없습니다. 이를 활용하여 CSRF 솔루션을 만들 수 있습니다. CSRF 공격을 방지하려면 XSRF-TOKEN이라는 추가 Javascript 판독 가능 쿠키를 작성해야합니다. 이 쿠키는 사용자가 로그인 할 때 생성되어야하며 추측 할 수없는 임의의 문자열을 포함해야합니다. 또한이 번호를 JWT 자체에 개인 클레임으로 저장합니다. JavaScript 응용 프로그램은 요청을 할 때마다이 토큰을 읽고 사용자 지정 HTTP 헤더로 보내야합니다. 이러한 작업 (쿠키 읽기, 헤더 설정)은 JavaScript 애플리케이션의 동일한 도메인에서만 수행 할 수 있으므로,
Angular JS는 당신의 인생을 쉽게 만듭니다
다행히도 플랫폼에서 Angular JS를 사용하고 CSRF 토큰 방식으로 Angular 패키지를 사용하여 구현하기가 더 간단 해졌습니다. Angular 애플리케이션이 서버를 만드는 모든 요청에 대해 Angular $http
서비스는 다음 작업을 자동으로 수행합니다.
- 현재 도메인에서 XSRF-TOKEN이라는 쿠키를 찾으십시오.
- 해당 쿠키가 발견되면 값을 읽고 X-XSRF-TOKEN 헤더로 요청에 추가합니다.
따라서 클라이언트 측 구현이 자동으로 처리됩니다! 우리 XSRF-TOKEN
는 서버 측의 현재 도메인에 쿠키를 설정해야하며 API가 클라이언트에서 호출을 받으면 X-XSRF-TOKEN
헤더 를 확인하고 쿠키 를 비교해야합니다.XSRF-TOKEN
하고 JWT에서 . 일치하면 사용자는 실제입니다. 그렇지 않으면 위조 된 요청이므로 무시해도됩니다. 이 방법은 "이중 제출 쿠키"방법에서 영감을 얻었습니다.
주의
실제로, 당신은 여전히 XSS에 취약합니다. 공격자가 나중에 사용하기 위해 JWT 토큰을 훔칠 수는 없지만 XSS를 사용하여 사용자 대신 요청을 할 수 있습니다.
JWT를 저장하든 localStorage
XSRF 토큰을 HttpOnly 쿠키가 아닌 곳에 저장하든 XSS를 통해 두 가지 모두 쉽게 잡을 수 있습니다. HttpOnly 쿠키의 JWT조차도 XST 방법 과 같은 고급 XSS 공격으로 잡을 수 있습니다 .
따라서 Double Submit Cookies 방법 외에도 이스케이프 컨텐츠를 포함하여 XSS에 대한 모범 사례를 항상 따라야합니다. 이것은 브라우저가 원하지 않는 일을하게하는 실행 코드를 제거하는 것을 의미합니다. 일반적으로 이는 // <![CDATA[
JavaScript를 평가하게 하는 태그 및 HTML 속성을 제거하는 것을 의미 합니다.
더 많은 것을 읽으십시오 :