이 내용을 읽기 전에 요아킴의 답변 을 읽으십시오. 그는 클라이언트 측 취약점의 일반적인 원인을 다룹니다. 자,이 문제를 어떻게 해결할 수 있는지 제안하십시오 ...
모든 요청에서 서버와 수동으로 인증하지 않고도 클라이언트와 서버 간 통신을위한 보안 체계 :
당신이있어 여전히 서버가 마지막 말을시키는, 서버는 여전히 클라이언트가 말한다 모든 것을 검증하기 위해이 있지만 투명하게 발생합니다.
MITMA ( Man-in-the-Middle) 공격 을 방지하기 위해 HTTPS 프로토콜을 가정하십시오 .
클라이언트는 처음으로 서버와 핸드 셰이크하고 서버 는 클라이언트 의 공개 키 를 생성 하고 비대칭 암호화 체계를 사용하여 개인 키 를 유지합니다. 클라이언트는 서버의 "공개"키를 로컬 저장소에 저장하고 어디에도 저장하지 않은 보안 암호로 암호화합니다.
이제 클라이언트가 오프라인 상태입니다. 클라이언트가 신뢰할 수있는 작업을 수행하려고합니다. 클라이언트는 비밀번호를 입력하고 서버의 공개 키를 가져옵니다.
클라이언트는 이제 해당 데이터에 대한 지식을 기반으로 조치를 수행 하고 클라이언트는 해당 클라이언트에 대한 서버의 공개 키로 수행하는 모든 조치를 암호화합니다 .
클라이언트가 온라인 상태 인 경우 클라이언트는 클라이언트 ID를 보내고 클라이언트가 수행 한 모든 작업은 서버의 공개 키로 암호화 된 서버로 전송됩니다.
서버는 조치를 해독하고 올바른 형식 인 경우 클라이언트에서 시작된 것으로 신뢰합니다.
노트 :
클라이언트의 암호는 어디에도 저장할 수 없습니다. 그렇지 않으면 공격자가 키를 가져 와서 자신의 동작에 서명 할 수 있습니다. 이 체계의 보안은 서버가 클라이언트에 대해 생성 한 키의 무결성에만 의존합니다. 클라이언트는 해당 키를 요청할 때 여전히 서버로 인증해야합니다.
실제로는 여전히 클라이언트가 아닌 보안 을 위해 서버 에 의존하고 있습니다. 클라이언트가 수행하는 모든 작업은 서버에서 확인 해야 합니다.
웹 워커 에서 외부 스크립트를 실행할 수 있습니다 . 명심 모든 JSONP의 당신이 요청은 이제 훨씬 더 큰 보안 문제입니다. 모든 비용으로 키를 보호해야합니다. 일단 분실하면 공격자가 사용자를 가장 할 수 있습니다.
이는 '서버에 핑 없음'이 수행되어야한다는 요구를 충족시킵니다. 공격자는 키를 모르는 경우 위조 된 데이터로 HTTP 요청을 단순히 모방 할 수 없습니다.
요아킴의 대답은 여전히 옳습니다 . 실제로 서버에서 모든 인증 을 수행하고 있습니다. 여기에 저장 한 유일한 것은 매번 서버에서 비밀번호를 확인해야한다는 것입니다. 커밋하거나 업데이트 된 데이터를 가져 오려면 서버 만 관련하면됩니다. 여기서 우리가 한 일은 클라이언트 측에 신뢰할 수있는 키를 저장하고 클라이언트가이를 다시 확인하도록하는 것입니다.
이는 단일 페이지 응용 프로그램 (예 : AngularJS)에 매우 일반적인 구성표입니다.
RSA 와 같은 체계에서 의미하는 바 때문에 서버의 공개 키를 "공개"라고 하지만 실제로는 체계에서 민감한 정보이므로 보호해야합니다.
암호를 메모리의 어느 곳에도 보관하지 않습니다. 오프라인 코드 실행을 시작할 때마다 사용자가 '오프라인'비밀번호를 제출하게합니다.
자체 암호화를 굴리지 마십시오 . 인증을 위해 Stanford와 같은 알려진 라이브러리를 사용하십시오.
이 조언 을있는 그대로 사용하십시오 . 실제 업무상 중요한 응용 프로그램에서 이러한 종류의 인증을 수행하기 전에 보안 전문가에게 문의하십시오 . 이것은 고통스럽고 잘못되기 쉬운 심각한 문제입니다 .
그건 중요한 다른 스크립트가 페이지에 액세스 할 수 없다. 이것은 웹 워커와 함께 외부 스크립트 만 허용한다는 것을 의미합니다. 사용자가 비밀번호를 입력 할 때 인터셉트 할 수있는 다른 외부 스크립트는 신뢰할 수 없습니다.
용도 prompt
및 하지 당신이 완전하게 확실하지 연기 실행을 할 경우 인라인 암호 필드를 (즉, 그것을해야 이벤트에 대한 액세스 권한 만 동기화 코드를 지점으로 살 수 없다). 그리고 실제로 암호를 변수에 저장하지 마십시오. 다시 말하지만 사용자 컴퓨터가 손상되지 않았다는 것을 신뢰하는 경우에만 작동합니다 (서버에 대한 유효성 검사에도 모두 해당됨).
우리는 여전히 클라이언트를 신뢰하지 않는다고 덧붙이고 싶습니다 . 당신 은 고객을 혼자 믿을 수 없으며 Joachim의 대답이 그것을 생각합니다. 작업을 시작하기 전에 서버를 핑하지 않아도되는 편리함 만 얻었습니다.
관련 자료 :