2017-10-06 1 views
0

내 웹 앱에 대한 CSRF 보호를 구현하는 방법을 파악하려고 미쳤습니다. 나는 많은 수의 페이지를 읽었지 만 여전히 나의 특정한 맥락에서 해결책을 결정할 수는 없다.서버에서 AngularJS 클라이언트로 CSRF 토큰 교환

그래서 내 웹 앱은 Angular로 작성되고 Apache 서버에 정적으로 배포됩니다. 응용 프로그램 서버와의 전쟁에서 배포 된 내 서버 인 Java 유형의 일부 서비스를 호출합니다. 두 도메인 모두 동일한 도메인에 배포됩니다. 인증 후 일반 세션 쿠키 (secure + HttpOnly)가 응답에 설정됩니다.

이제 싱크로 나이저 토큰 또는 이중 제출 쿠키 패턴을 기반으로 한 CSRF 보호를 구현하고 싶습니다.하지만 서버 측에서 상태를 처리 할 수있는 첫 번째 방법이 더 나은 해결책입니다.

내가 본 해결책의 대부분은 토큰 서버 측을 생성하고 쿠키에 저장하여 클라이언트 측에서 액세스 할 수 있도록 제안하고 있습니다. 이것에 대한 제약 조건은 작동하는데, 나는 그것이 크다. Javascript가 액세스 할 수 없기 때문에 쿠키가 HttpOnly가 될 수 없다는 것이다. 더욱이 나는 완벽하게 보호되지 않은 쿠키에서 토큰을 공유하는 것이 좋은 생각이 아닐 것이라고 생각한다. 하지만 그것은 AngularJS에서 권장되는 솔루션 인 것 같습니다 ...

그래서이 솔루션을 폐기하면 무엇이 남았습니까? 토큰을 쿠키가 아닌 응답 헤더에 두는 것? 안전한가요? 토큰을 가져 오기위한 서비스 공개? 그것이 좋은 생각인지 실용적 일지 모르지만 확실하지 않은가? OWASP Guard처럼 토큰을 제공하기 위해 자바 스크립트를 빌드하는 서블릿을 공개 하시겠습니까? 다른 건 없나요?

EDIT : 솔루션으로 HTTP 응답에서 토큰 이름과 값을 주입하기 위해 Spring이 사용중인 것 같습니다.

도움 주셔서 감사합니다.

답변

0
  1. 사용자 세션 당 한 번 CSRF 토큰을 생성해야합니다.
  2. 서버 측 세션 (Java의 경우 HttpSession)에 저장해야합니다.
  3. 클라이언트는 브라우저의 쿠키가 아닌 숨겨진 매개 변수로 토큰을 저장해야합니다.
  4. 서버는 각 요청에 대해 CSRF 토큰의 존재를 확인하고 세션에 저장된 토큰과 비교해야합니다.

자세한 내용 : https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

+0

네, 모두가 분명하다. 내가 놓친 것은 서버 측에서 생성 된 쿠키를 클라이언트에게 안전하고 깨끗한 방법으로 전송하는 방법이다. – Xendar

+0

Java EE 애플리케이션은 토큰을 요청 속성으로 다시 클라이언트로 전달한다. AngularJS 클라이언트의 경우 JSON – Vel

+0

을 사용하여 토큰을 전달할 수 있다고 가정합니다. 예를 들어 로그인 응답의 일부로 말입니까? – Xendar