후레임의 프로그래밍
양식 기반 웹 사이트 인증에 대한 확실한 가이드 본문
질문
우리는 Stack Overflow가 매우 구체적인 기술적 질문에 대한 리소스 일뿐만 아니라 일반적인 문제의 변형을 해결하는 방법에 대한 일반적인 지침을 제공해야한다고 믿습니다. "웹 사이트에 대한 양식 기반 인증"은 이러한 실험에 적합한 주제 여야합니다.
다음과 같은 주제가 포함되어야 합니다.
- 로그인 방법
- 로그 아웃하는 방법
- 로그인 상태를 유지하는 방법
- 쿠키 관리 (권장 설정 포함)
- SSL / HTTPS 암호화
- 비밀번호 저장 방법
- 비밀 질문 사용
- 잊혀진 사용자 이름 / 비밀번호 기능
- OpenID
- "기억하기" 확인란
- 브라우저의 사용자 이름 및 비밀번호 자동 완성
- 비밀 URL (다이제스트로 보호되는 공개 URL)
- 비밀번호 안전성 확인
- 이메일 검증
- 및 폼 기반 인증..
다음을 포함해서는 안됩니다.
- 역할 및 권한
- HTTP 기본 인증
다음 방법으로 도와주세요 :
- 하위 주제 제안
- 이 주제에 대한 좋은 기사 제출
- 공식 답변 수정
답변
1. 로그인 방법
인증을 위해 서버 측의 스크립트에 값을 게시하는 로그인 + 암호 HTML 양식을 작성하는 방법을 이미 알고 있다고 가정합니다. 아래 섹션에서는 건전한 실제 인증 패턴과 가장 일반적인 보안 위험을 피하는 방법을 다룹니다.
HTTPS로 또는 HTTPS로?
연결이 이미 안전하지 않은 경우 (즉, SSL / TLS를 사용하여 HTTPS를 통해 터널링 됨) 로그인 양식 값이 일반 텍스트로 전송되어 브라우저와 웹 서버 사이의 라인을 도청하는 모든 사람이 통과 할 때 로그인을 읽을 수 있습니다. 을 통하여. 이러한 유형의 도청은 정부에서 일상적으로 수행하지만 일반적으로 '소유'전선은 HTTPS를 사용하는 것 외에는 다루지 않습니다.
본질적으로 로그인하는 동안 도청 / 패킷 스니핑을 방지 하는 유일한 실질적인 방법은 HTTPS 또는 다른 인증서 기반 암호화 체계 (예 : TLS ) 또는 검증되고 테스트 된 시도 응답 체계 (예 : Diffie-Hellman)를 사용하는 것입니다. 기반 SRP). 다른 방법은 도청 공격자 가 쉽게 우회 할 수 있습니다 .
물론, 약간 비실용적이라면 어떤 형태의 이중 인증 체계 (예 : Google Authenticator 앱, 물리적 '냉전 스타일'코드북 또는 RSA 키 생성기 동글)를 사용할 수도 있습니다. 올바르게 적용하면 보안되지 않은 연결에서도 작동 할 수 있지만 개발자가 SSL이 아닌 이중 인증을 구현할 것이라고 상상하기는 어렵습니다.
(금지) 자체 자바 스크립트 암호화 / 해싱 롤링
주어 인식 (지금은 비록 피할 수 ) 비용과 웹 사이트에 SSL 인증서를 설정하는 기술적 어려움은, 일부 개발자는 보안되지 않은 회선을 통해 일반 텍스트 로그인을 통과 피하기 위해 자신의 브라우저 해시 또는 암호화 체계를 롤 유혹.
이것은 고상한 생각이지만, 위의 중 하나와 결합되지 않는 한 본질적으로 쓸모가 없습니다 ( 보안 결함이 될 수 있음 ). 즉, 강력한 암호화로 회선을 보호하거나 검증 된 도전 응답을 사용하는 것입니다. 메커니즘 (그게 무엇인지 모르는 경우 가장 증명하기 어렵고, 설계하기 가장 어렵고, 디지털 보안에서 개념을 구현하기 가장 어려운 것 중 하나라는 것을 알고 있어야합니다).
암호 해싱이 암호 공개 에 대해 효과적 일 수 있다는 것은 사실이지만 재생 공격, 중간자 공격 / 도용 (공격자가 보안되지 않은 HTML 페이지에 도달하기 전에 몇 바이트를 삽입 할 수있는 경우)에 취약합니다. 브라우저에서는 단순히 JavaScript에서 해싱을 주석 처리하거나 무차별 대입 공격 (공격자에게 사용자 이름, 솔트 및 해시 된 암호를 모두 제공하기 때문에)을 주석 처리 할 수 있습니다.
인류에 대한 보안 문자
CAPTCHA 는 하나의 특정 공격 범주 인 자동화 된 사전 / 무력한 시행 착오를 작업자없이 차단하기위한 것입니다. 이것이 실제 위협이라는 것은 의심의 여지가 없지만 CAPTCHA, 특히 적절하게 설계된 서버 측 로그인 제한 체계를 필요로하지 않는 원활하게 처리하는 방법이 있습니다. 이에 대해서는 나중에 논의 할 것입니다.
CAPTCHA 구현은 비슷하게 생성되지 않습니다. 그들은 종종 인간이 해결할 수 없으며, 대부분은 실제로 봇에 대해 비효율적이며, 모두 값싼 제 3 세계 노동에 대해 비효율적이며 ( OWASP 에 따르면 현재 작업장 요금은 500 회 테스트 당 $ 12입니다) 일부 구현은 다음과 같을 수 있습니다. 일부 국가에서는 기술적으로 불법입니다 ( OWASP 인증 치트 시트 참조 ). CAPTCHA를 사용해야하는 경우 Google의 reCAPTCHA를 사용하세요. 정의상 OCR이 어렵고 (이미 OCR로 잘못 분류 된 도서 스캔을 사용하기 때문에) 사용자 친화적이려고 매우 노력하기 때문입니다.
개인적으로 저는 CAPTCHAS가 짜증나는 경향이 있으며 사용자가 여러 번 로그인에 실패하고 제한 지연이 최대 일 때 마지막 수단으로 만 사용합니다. 이것은 수용 할 수있을만큼 거의 발생하지 않으며 시스템 전체를 강화합니다.
비밀번호 저장 / 로그인 확인
이것은 최근 몇 년간 우리가 목격 한 모든 고도로 공개 된 해킹과 사용자 데이터 유출 이후에 마침내 상식이 될 수 있지만, 데이터베이스에 암호를 일반 텍스트로 저장하지 마십시오. 사용자 데이터베이스는 SQL 주입을 통해 일상적으로 해킹, 유출 또는 수집되며 원시 일반 텍스트 암호를 저장하는 경우 로그인 보안을 위해 즉시 게임이 종료됩니다.
따라서 비밀번호를 저장할 수없는 경우 로그인 양식에서 게시 된 로그인 + 비밀번호 조합이 올바른지 어떻게 확인합니까? 대답은 키 유도 함수를 사용하여 해싱하는 것 입니다. 새 사용자가 생성되거나 암호가 변경 될 때마다 암호를 가져와 Argon2, bcrypt, scrypt 또는 PBKDF2와 같은 KDF를 통해 실행하여 일반 텍스트 암호 ( "correcthorsebatterystaple")를 길고 임의의 문자열로 바꿉니다. , 데이터베이스에 저장하는 것이 훨씬 안전합니다. 로그인을 확인하려면 입력 한 암호에 대해 동일한 해시 함수를 실행합니다. 이번에는 솔트를 전달하고 결과 해시 문자열을 데이터베이스에 저장된 값과 비교합니다. Argon2, bcrypt 및 scrypt는 이미 해시와 함께 솔트를 저장합니다. 자세한 내용은 sec.stackexchange에 대한 이 기사 를 확인 하십시오.
솔트가 사용되는 이유는 해싱 자체로는 충분하지 않기 때문 입니다. 레인보우 테이블 로부터 해시를 보호하기 위해 소위 '솔트'를 추가하는 것이 좋습니다. 솔트는 정확히 일치하는 두 개의 암호가 동일한 해시 값으로 저장되는 것을 효과적으로 방지하여 공격자가 암호 추측 공격을 실행하는 경우 전체 데이터베이스가 한 번에 검색되는 것을 방지합니다.
사용자가 선택한 암호는 충분히 강력하지 않고 (즉, 일반적으로 엔트로피가 충분하지 않음) 암호 저장에 암호 해시를 사용해서는 안되며 해시에 액세스 할 수있는 공격자가 암호 추측 공격을 비교적 짧은 시간에 완료 할 수 있습니다. KDFs가 사용되는 이유이다 -이 효과적으로 "키 스트레칭" 1 만 배 느린 암호를 추측 공격자 원인 모든 암호가 공격자의 차종을 생각한다는 의미는 예를 들어, 10,000 번 해시 알고리즘의 여러 번 반복됩니다,.
세션 데이터- "Spiderman69로 로그인되었습니다"
서버가 사용자 데이터베이스에 대해 로그인 및 암호를 확인하고 일치하는 항목을 찾으면 시스템은 브라우저가 인증되었음을 기억할 방법이 필요합니다. 이 사실은 세션 데이터에 서버 측에만 저장되어야합니다.
세션 데이터에 익숙하지 않은 경우 작동 방식은 다음과 같습니다. 임의로 생성 된 단일 문자열이 만료되는 쿠키에 저장되고 서버에 저장된 데이터 모음 (세션 데이터)을 참조하는 데 사용됩니다. MVC 프레임 워크를 사용하는 경우 의심 할 여지없이 이미 처리되었습니다.
가능하다면 세션 쿠키에 브라우저로 전송 될 때 보안 및 HTTP 전용 플래그가 설정되어 있는지 확인하십시오. HttpOnly 플래그는 XSS 공격을 통해 읽는 쿠키에 대해 일부 보호 기능을 제공합니다. 보안 플래그는 쿠키가 HTTPS를 통해서만 다시 전송되도록 보장하므로 네트워크 스니핑 공격으로부터 보호합니다. 쿠키의 값은 예측할 수 없어야합니다. 존재하지 않는 세션을 참조하는 쿠키가 표시되는 경우 세션 고정 을 방지하기 위해 해당 값을 즉시 교체해야합니다 .
2. 로그인 상태를 유지하는 방법-악명 높은 "기억하기"확인란
영구 로그인 쿠키 ( "기억하기"기능)는 위험 영역입니다.
개인적으로는 정기적으로 방문하는 웹 사이트에 대한 지속적인 로그인을 좋아하지만 안전하게 처리하는 방법을 알고 있습니다.
물론 일부 시스템은 어떤계정도 해킹 당할 수 없습니다.
영구 로그인 쿠키를 구현하기로 결정한 경우 수행하는 방법은 다음과 같습니다.
-
먼저 시간을내어 Paragon을 읽어보십시오.
-
그리고 가장 일반적인 함정 중 하나를 반복하기 위해 데이터베이스에 영구 로그인 쿠키 (토큰)를 저장하지 말고 해시로만 저장하십시오!로그인 토큰은 비밀번호와 동일합니다.
3. 비밀 질문 사용
'비밀 질문'을 구현하지 마세요.
사용자 지정 질문이 있더라도 대부분의 사용자는 다음 중 하나를 선택할 가능성이 높습니다.
-
어머니의 결혼 전 이름이나 좋아하는 애완 동물과 같은 '표준'비밀 질문
-
블로그, LinkedIn 프로필 또는 이와 유사한 항목에서 누구나 끌어 올릴 수있는 간단한 퀴즈
-
비밀번호를 추측하는 것보다 답하기 쉬운 질문입니다.
결론적으로 보안 질문은 거의 모든 형태와 변형에서 본질적으로 안전하지 않으며 어떤 이유로 든 인증 체계에 사용해서는 안됩니다.
보안 질문이 실제로 존재하는 진정한 이유는 재 활성화 코드를 얻기 위해 이메일에 액세스 할 수없는 사용자의 몇 가지 지원 전화 비용을 편리하게 절약 할 수 있기 때문입니다.
4. 잊어 버린 암호 기능
분실 / 분실 한 사용자 비밀번호를 처리하기 위해 보안 질문을 사용하지 않아야이유를 이미 언급했습니다.
-
잊어 버린 비밀번호를 자동 생성 된 강력한 비밀번호로 재설정하지 마세요. 이러한 비밀번호는 기억하기가 매우 어렵 기 때문에 사용자가 변경하거나 적어 두어야합니다 (예 : 밝은 노란색).
-
분실 한 비밀번호 코드 / 토큰은 항상 데이터베이스에서 해시합니다.
마지막 참고 : '분실 된 비밀번호 코드'를 입력하기위한 인터페이스가 최소한 로그인 양식 자체만큼 안전한지 항상 확인하십시오. 그렇지 않으면 공격자가 액세스 권한을 얻기 위해이를 사용합니다.
5. 비밀번호 안전성 확인
먼저 현실 점검을 위해 다음과 같은 작은 기사를 읽어 보시기 바랍니다. 가장 일반적인 500 가지 비밀번호
알겠습니다.이 목록은 어디서나모든시스템에서 가장 일반적인 비밀번호의 표준목록이 아닐 수도 있지만 좋습니다.
따라서 : 최소 비밀번호 안전성 요구 사항이 없으므로 사용자의 2 %가 가장 일반적인 상위 20 개 비밀번호 중 하나를 사용합니다.
이를 방지하려면 비밀번호의 엔트로피를 계산 한 다음 임계 값을 적용해야합니다.
또한 높은 엔트로피 암호의 사용자 친 화성을 새로 고치기 위해 Randall Munroe의 암호 강도 xkcd는
Troy Hunt의 Have I Been Pwned API를 활용하여 공개 데이터 침해로 인해 손상된 비밀번호에 대해 사용자 비밀번호를 확인합니다. <
6. 훨씬 더-또는 : 신속한 로그인 시도 방지
First, have a look at the numbers: Password Recovery Speeds - How long will your password stand up
해당 링크에 있는 표를 살펴볼 시간이 없다면 다음 목록을 참조하세요.
-
주판으로 암호를 해독하는 경우에도 취약한 암호를 해독하는 데 거의 시간이 없음
-
대소 문자를 구분하지 않는
영숫자 9 자리 비밀번호를 해독하는 데 거의 시간이 걸리지 않습니다.
-
길이가 8 자 미만</strong 인 경우 복잡한 기호, 문자, 숫자, 대소 문자 암호를 해독하는 데 거의 시간이 걸리지 않습니다.
-
그러나 초당 한 번만 시도 할 수있는 경우</p로 6 자 비밀번호를 해독하는 데 시간이 너무 많이 걸립니다.
그러면이 숫자에서 무엇을 배울 수 있습니까?
일반적으로 무차별 대입 공격에 모두 효과적인 세 가지 선택이 있습니다 (및 사전 공격이지만 이미 강력한 비밀번호 정책을 사용하고 있으므로 문제가되지 않습니다)
-
N 번의 시도 실패 후 CAPTCHA제시 (지옥처럼 성 가시고 종종 비효율적이지만 여기서 반복합니다)
-
계정 잠금및 N 회 실패 후 이메일 확인 필요 (
-
마지막으로 로그인 조절: 즉, N 번의 시도 실패 후 시도 사이의 시간 지연을 설정합니다 (예, DoS 공격은 여전히 가능하지만 적어도 가능성은 훨씬 적고 훨씬 더 많습니다.
-
모범 사례 # 1 :다음과 같이 실패한 시도 횟수에 따라 증가하는 짧은 시간 지연 :
- 1 회 실패 = 지연 없음
- 2 회 실패 = 2 초 지연
- 3 회 실패 = 4 초 지연
- 4 회 실패 = 8 초 지연
- 5 회 실패 = 16 초 지연
- 등
이 계획을 공격하는 DoS는 그 결과 잠금 시간이 이전 잠금 시간의 합계보다 약간 더 크기 때문에 매우 비실용적입니다.
명확하게 설명 : 지연은 브라우저에 응답을 반환하기 전 지연이 아닙니다.
모범 사례 # 2 :다음과 같이 N 번의 시도 실패 후 적용되는 중간 길이의 시간 지연입니다.
- 1-4 회 실패 = 지연 없음
- 5 회 실패 = 15-30 분 지연
이 계획을 공격하는 DoS는 매우 비실용적이지만 확실히 가능합니다.
모범 사례 # 3 :두 가지 접근 방식 결합-N 번의 시도 실패 후 적용되는 고정 된 짧은 시간 지연 :
- 1-4 회 실패 = 지연 없음
- 5 회 이상의 실패 시도 = 20 초 지연
또는 다음과 같이 고정 된 상한으로 지연 증가 :
- 1 회 실패 = 5 초 지연
- 2 회 실패 = 15 초 지연
- 3 회 이상의 실패 시도 = 45 초 지연
이 최종 계획은 OWASP 모범 사례 제안 (MUST-READ 목록의 링크 1)에서 가져 왔으며 제한적인 측면에서 인정 되더라도 모범 사례로 간주되어야합니다.
하지만 일반적으로 비밀번호 정책이 강력할수록 지연으로 인해 사용자를 괴롭힐 필요가 줄어 듭니다.
이 최종 로그인 제한 체계를 공격하는 DoS는 매우비현실적입니다.
또한 가장 매력적인 진입 점 인 관리자 계정에 대해보다 공격적인 조절을 수행하는 것이 합리적입니다.
7. 분산 형 무차별 대입 공격
다만, 고급 공격자들은 '활동 확산'을 통해 로그인 제한을 우회하려고합니다.
-
IP 주소 플래그 지정을 방지하기 위해 봇넷에 시도 배포
-
사용자 한 명을 선택하고 50.000 개의 가장 일반적인 암호를 시도하는 대신 (우리의 제한으로 인해 불가능) 가장 일반적인 암호를 선택하여 대신 50.000 명의 사용자를 대상으로 시도합니다.
-
각 사용자 계정에 대한 로그인 요청 간격 (예 : 30 초 간격으로)
여기에서 가장 좋은 방법은 시스템 전체에서 실패한 로그인 횟수를 기록하고 사이트의 불량 로그인 빈도의 평균을 기준으로 사용하는 것입니다.
너무 추상적입니까?
지난 3 개월 동안 귀하의 사이트에 하루 평균 120 회의 불량 로그인이 발생했다고 가정 해보십시오.
또한 자세한 내용과 좋은 토론을 통해 질문을 게시했습니다.
8. 2 단계 인증 및 인증 제공 업체
익스플로잇, 비밀번호를 적어두고 분실 한 경우, 키가있는 랩톱을 도난 당하거나 사용자가 피싱 사이트에 로그인하는 등 자격 증명이 손상 될 수 있습니다.
인증은 다른 공급자가 자격 증명 수집을 처리하는 싱글 사인온 서비스에 완전히 위임 될 수 있습니다.
필독 웹 인증 관련 링크
'스택오버플로우(Stack Overflow)' 카테고리의 다른 글
텍스트 선택 강조 표시를 비활성화하는 방법 (0) | 2020.11.11 |
---|---|
다른 JavaScript 파일에 JavaScript 파일을 어떻게 포함합니까? (0) | 2020.11.11 |
REST의 PUT vs POST (0) | 2020.10.26 |
Linux에서 특정 텍스트가 포함 된 모든 파일을 찾으려면 어떻게합니까? (0) | 2020.10.26 |
JavaScript 비교에서 ==와 ===의 차이는 무엇일까요? (0) | 2020.10.26 |