로그인은 사용자를 식별하는 프로세스인 인증의 한 가지 형태다. 기본 인증 방식은 사용자가 제공한 사용자 이름과 암호 사이에 콜론(:) 문자를 연결해 username:password 문자열을 생성한다. 이후 Base64라는 알고리듬을 사용해 문자열을 인코딩한 후, HTTP 요청의 Authorizationa 헤더에 있는 서버로 다시 전송한다. 다이제스트 인증은 브라우저가 사용자 이름, 암호, URL로 구성된 해시를 생성하는 것이다. 해시는 단방향 암호화 알고리듬의 출력값으로, 고유한 패턴을 생성한다. 그러나 이런 HTML 네이티브 인증 방식은 웹사이트에 맞게 인증 프롬프트를 스타일링 할 수 없어 사용자 경험에서 불편하다. 따라서 현대의 웹사이트들은 UI 구현과 세션 관리가 쉽고 비밀번호 복구 등 추가 보안 관리에 용이한 네이티브가 아닌 서드 HTML(폼 기반 인증, OAuth, JWT)로 구현하게 된다.
해커들은 대개 로그인 페이지에서 일반적으로 사용되는 수천 개의 암호를 시도하려고 스크립트를 통한 무작위 대입 공격을 사용한다. 이전 데이터 침해를 참고한다면 공격자는 어떤 암호를 먼저 시도해야 하는지 우선순위를 쉽게 결정할 수 있다. 이러한 공격에서 인증을 구현하고 보호하기 위해서는, 다음과 같은 방법이 필요하다. 인증 시스템을 구현하는 대신 페이스북 로그인 같은 서드 파티 서비스를 사용하면, 사용자 입장에선 비밀번호를 저장해야 하는 부담을 덜고, 소셜 미디어 자격 증명으로 웹사이트에 인증하기 때문에 안전하다. 이 경우엔 보통 개인 이메일 주소를 사용자 이름으로 사용한다. Single Sign-On ID제공자와 통합한다면 비즈니스 이메일로 서드 파티 애플리케이션에 쉽게 로그인할 수 있다. 회사 입장에선 직원이 어떤 사이트에 액세스할 수 있는지, 사용자 자격 증명이 회사의 서버에 안전하게 저장되는지 최종 제어 권한을 유지할 수 있다. 그러나 모든 사용자가 소셜 미디어나 지메일 계정을 갖고 있지 않기 때문에 사용자가 이름과 암호를 수동으로 선택할 수 있는 자체 인증 시스템을 추가로 구현해야 한다. 이는 웹사이트에 별도로 데이터베이스에 자격 증명을 저장, 업데이트하고 확인하는 코드도 작성하는 등 매커니즘이 필요하다.
안전한 인증 시스템을 구축하기 위해선 사용자 이름과 비밀번호에 더해 유효한 이메일 주소를 제출하도록 요구해야 한다. 사용자가 자격 증명을 잊어버렸을 때 암호 재설정 이메일을 보내야 하기 때문이다. 유효한 이메일을 확인하기 위해서, 유효성 검사 토큰이 포함된 이메일을 보내고 실제로 이메일 계정에 엑세스 할 수 있는지 확인할 수 있다. 또한 암호 재설정 시 해커가 오래된 재설정 링크를 남용하지 않도록 30분 후에 재설정 토큰을 만료하는 것이 좋다. 비밀번호가 복잡성 기준을 충족하는 것도 중요하다. password-strength-calculator 라이브러리와 같은 일부 자바스크립트 라이브러리를 사용해 사용자가 보다 안전한 암호를 찾도록 해야 한다.
비밀번호를 안전하게 데이터베이스에 저장하기 위해 암호화 해시 알고리듬으로 처리해야 한다. 암호를 크래킹할 때 유출된 암호 해시 목록에 대한 리버스 엔지니어링이 될 수 있다. 해커가 레인보우 테이블을 이용해 공격을 할 수 있기 때문에 해싱 알고리듬에 임의성 요소를 추가하는 솔팅처리를 통해 레인보우 공격을 수행할 수 없도록 대응한다.
그러나 암호 기반 인증 시스템은 항상 무작위 대입 공격에 취약하므로, 멀티팩터 인증 (MFA)을 추가로 구현하는 것이 좋다. MFA는 복귀하는 사용자가 세 가지 정보 (알고 있는 정보, 갖고 있는 정보, 존재하는 정보) 범주 중 적어도 두 가지로 자신을 식별하는 것을 의미한다. 예를 들어 ATM에서 계정 소유자의 PIN과 은행 카드를 이용하는 것, 스마트폰의 지문 스캐닝과 같은 생체 인식을 사용하는 것이다. 웹사이트는 일반적으로 사용자 이름과 비밀번호에 스마트폰 인증자 확인을 요구한다.
로그아웃 기능을 추가하는 것도 보안을 위한 중요한 방법이다. 로그아웃 시에 브라우저에서 세션 쿠키를 지우고 서버 측에 저장하여 세션 식별자를 무효화하면 세션 쿠키를 가로채거나 도난당한 쿠키를 사용해 세션을 재설정하려는 공격에서부터 보호할 수 있다.
또한 페이지의 응답에서 사용자의 정보가 누출되지 않도록 오류 메시지를 일반적인 메시지로 유지하는 것도 중요하다. 암호 재설정 화면에서도 사용자 이름이 표시되지 않도록 해야 한다.
컴퓨터가 수행하기 어려운 다양한 이미지 인식 작업인 캡챠 (CAPTCHA)를 구현하는 것도 해킹 시도를 저지할 수 있는 좋은 방법이다.
'Book' 카테고리의 다른 글
웹 개발자를 위한 웹 보안: 10장 요약 - 세션 하이재킹 (0) | 2024.09.18 |
---|---|
웹 개발자를 위한 웹 보안: 8장 요약 - 사이트 간 요청 위조 공격 (1) | 2024.09.17 |
웹 개발자를 위한 웹 보안: 7장 요약 - 크로스 사이트 스크립팅 공격 (0) | 2024.09.17 |
웹 개발자를 위한 웹 보안: 6장 요약 - 인젝션 공격 (3) | 2024.09.16 |
웹 개발자를 위한 웹 보안: 5장 요약 - 프로그래머 작동 방식 (0) | 2024.09.16 |