자동 로그인을 안전하게 구현하는 방법


15

"암호를 잘못 저장하는 방법"에 대한 많은 글을 읽었습니다 . 이들은 항상 사용자가 로깅하는 서버에 비밀번호를 저장하는 것을 말합니다. 그들은 기본적으로 재탕 등 등 그러나, 나는이에 암호를 저장하기위한 모범 사례에 관한 기사를 본 적이 있는지 소금에 암호를, 메이크업 등의 유비쿼터스 조언을 (말장난 의도) 클라이언트 는 클라이언트가 로그인 할 필요가 없습니다 그래서 로그인 할 때마다 수동으로; "기억하십시오"기능.

브라우저에서 Dropbox와 같은 프로그램에 이르기까지 많은 소프트웨어가이 기능을 가지고 있습니다.

Dropbox가 다른 컴퓨터에 복사 / 붙여 넣기를하고 Dropbox를 시작하고 ID를받은 장치로 로그인 할 수있는 컴퓨터에 ID를 저장하는 방법에 대한 최근 기사를 읽었습니다 . Dropbox 계정에 대한 로그인, 아무것도, 전체 액세스 권한이 없습니다. 이것은 정말 어리석은 디자인처럼 보이지만 더 좋은 방법은 생각할 수 없습니다.

쿠키와 같은 것을 일반 텍스트로 저장하지 않는 방법조차 확실하지 않습니다. 암호를 해독 할 경우 암호를 해독하기 위해 키를 어디에 저장합니까?

보안 취약점을 도입하지 않는 유일한 방법은 자동 로그인 기능을 제거하고 서비스를 사용할 때마다 사용자가 암호를 입력하도록하는 것입니다. 그러나 이는 사용상의 어려움이며 사용자는 그렇게 할 필요가 없습니다.

자동 로그인 기능을 구현하기 위해 자격 증명을 안전하게 로컬에 저장하는 방법에 대해 무엇을 읽을 수 있습니까? 전체 기사에 대해 원칙이 너무 단순하다면 무엇입니까? 문제의 소프트웨어는 모든 플랫폼에없는 기능 (예 : 일부 Linux 배포판의 "키 체인")에 의존해서는 안됩니다.


2
당신이 믿는 것에 관한 것입니다. 컴퓨터 저장소 ID를 신뢰하지 않으면 이것이 문제입니다. 키 체인을 믿으면 이것이 얻을 수있는 최대의 보안입니다. 물론 장치 하드웨어 또는 무언가 감지와 같은 사용자 지정 안전을 추가 할 수는 있지만 모두 가짜 가능하므로 결국 알 수 없습니다. 통제 할 수 없습니다. 물론 일반 텍스트 암호 저장과 같은 어리석은 것은 제외됩니다.
— Luc Franken

@LucFranken 어떻게 기계를 신뢰할 수 있습니까? 보관함처럼 누군가가 당신을 악용 할 수 있습니다. 또한 키 체인을 신뢰하지만 모든 컴퓨터에 키 체인이있는 것은 아니며 Windows는 절대 그렇지 않습니다 (AFAIK). 암호를 저장하는 경우 일반 텍스트로 저장하지 않으려면 어떻게해야합니까? 암호를 암호화하면 암호를 해독하기 위해 키를 어디에 저장합니까?
— Jay Simon

그것은 정확히 문제입니다, 당신은 그것을 믿을 수 없습니다. 사용자는 신뢰 만 정의 할 수 있습니다. 사용자는 자신의 컴퓨터가 얼마나 안전한지 이해합니다. Dropbox에서 데이터를 가져 오는 바이러스를 작성하는 것이 가능합니다. 로컬로 저장된 키 및 기타 로컬 데이터와 동일합니다. 더 안전하게 만드는 데 도움이 될 수 있지만 (5 숫자 코드가 필요한 앱에 대해 생각하십시오) 결국에는 로컬이며 통제 할 수 없습니다.
— Luc Franken

@LucFranken 그냥 나입니까 아니면 자동 로그인이 유비쿼터스 기능처럼 보입니까? 그렇다면 사람들이 올바른 방법에 대해 쓰지 않은 이유는 무엇입니까?
— Jay Simon

더 많은 엔터프라이즈 소프트웨어가 허용하지 않지만 매우 일반적인 요구 사항입니다. 예를 들어 SalesForce에서는 비밀번호가 아닌 사용자 이름 만 저장할 수 있습니다. btw를 명확히하자. 로그인을 위해 클라이언트에 비밀번호를 저장할 필요가 없습니다. 서버의 해시에 해당하는 임의의 해시를 저장할 수 있습니다.
— Luc Franken

답변:


12

한 가지 방법은 다음과 같습니다.

  • 사용자가 로그인 할 때 세션 아이디 를 클라이언트 컴퓨터의 쿠키 (사용자 이름 또는 비밀번호가 아님)에 저장하십시오.
  • 세션을 IP 주소에 연결하기 때문에 개별 세션 ID는 시작된 컴퓨터에서만 작동합니다.

사이트를 개발하는 데 사용하는 프레임 워크에 따라이 동작은 기본 제공 기능으로 제공 될 수 있습니다.

HTTP 프로토콜은 상태가 유지되지 않기 때문에 웹 사이트를 사용하는 단일 세션 동안 누군가 로그인 상태를 유지하고 다음에 사이트를 사용할 때 "자동 로그인"하는 것과는 기능상의 차이가 없습니다. 세션이 만료되기 전에 얼마나 많은 시간을 허용 하는가에 달려 있습니다.

업데이트 : 또한 보안 강화를 위해 HTTPS를 사용하십시오.

업데이트 2 : 이 방법은 IP 주소를 많이 변경하는 사용자에게는 효과가 없다는 점에서 한계가 있습니다. 그러나 보안 수준이 향상되어 일부 상황에서 유용 할 수 있습니다.


1
누군가와 같은 방화벽 뒤에있는 컴퓨터가있을 수 있기 때문에 IP 주소로 연결해도 큰 도움이되지 않습니다.
— Jay Simon

2
@JaySimon, 나는 "별로 도움이되지 않는다"고 말하지 않을 것입니다. 같은 방화벽 뒤에있는 컴퓨터 수는 전 세계 컴퓨터 수보다 훨씬 적습니다. 공격에 대한 잠재적 노출을 제한하는 것이므로 크게 제한합니다. 이것은 표준 접근 방식이며, 그 이상으로 할 수있는 일이 많이 없다고 생각합니다. 누군가 사용자 와 동일한 IP 주소를 가지고 있고 세션 ID를 얻기 위해 관리하는 경우 해당 사용자는 서버의 관점에서 사용자와 구별 할 수 없습니다. 귀하의 사이트에 어떤 종류의 로그인 이있는 경우 그러한 공격에 노출됩니다.

3
IP 주소가 자주 바뀔 수있는 휴대 전화 사용자에게는 그러한 접근 방식이 성 가실 것이라고 생각하십니까?
— Jay Simon

@JaySimon, 세션 내에서 발생하면 사용자는 갑작스런 로그 아웃으로 경험할 것입니다. 그래도 그들이 실제로 얼마나 자주 바뀌는 지 모르겠습니다 (빠른 Google 검색은 명확한 답변을 나타내지 않습니다). IP를 실제로 사용하는 동안 IP가 변경되지 않는 한 걱정하지 않아도됩니다.

IP로 세션을 제한하는 것은 실제로는 현실적이지 않습니다. 사용자는 위치를 자주 바꿉니다. 휴대폰뿐만 아니라 랩탑도; 예를 들어 플렉스 작업. 당신이 할 수있는 최선의 방법은 GeoIP 검사가 그 거리를 여행하는 시간과 결합 된 것입니다. Gmail처럼
— Lode

5

아마존 (및 기타 많은)은 하이브리드 방식을 사용합니다. 검색, 장바구니에 품목 추가 및 이전에 사용한 신용 관리 / 배송 주소 조합을 사용하여 주문을하기위한 자동 로그인 기능을 제공합니다. 그러나 신용 카드 추가, 배송 주소 추가 / 변경, 비밀번호 업데이트, 과거 주문보기 (선택적으로 사용자에게) 및 기타 여러 계정 설정과 같은 많은 작업에 비밀번호를 입력해야합니다.

예, 컴퓨터에 액세스하는 사람들은 세션을 가로 챌 수 있지만 여전히 주문한 것을 얻을 수 있습니다! (더 중요한 것은 세션을 가로채는 인센티브는 거의 무시됩니다.) 그러나 누군가 내 컴퓨터에 액세스 할 수 있다면 평균 사이트 세션을 훔치는 사람들보다 더 큰 문제가 있습니다.

높은 보안 수준이 필요하지 않은 응용 프로그램 부분이있는 경우 사용자를 사이트의 낮은 보안 부분에 자동 로그인하기 위해 세션 ID (해시 또는 원하는 경우)를 저장하는 하이브리드 모델을 선택할 수 있습니다 보안이 높은 영역에 들어가면 암호를 입력하고 세션이 끝나면 높은 보안 토큰을 삭제해야합니다.

물론 이것이 뱅킹 레벨 사이트 인 경우 자동 로그인보다 옵션이 아닙니다. 다시 한 번 이러한 유형의 보안을 사용하는 사이트는 보호하는 데이터의 가치를 가정하고 사용자 편의성이 향상되어 납치 된 세션의 잠재적 위험을 평가합니다. 귀하의 응용 프로그램이 그렇지 않다고 생각되면 자동 로그인을 구현하지 마십시오. 사용 사례에 적합한 보안 / 사용성 수준에 액세스해야합니다.


2

실제로 그렇게 어렵지는 않습니다. 먼저 다음 형식으로 쿠키를 저장하십시오.

userID.token

토큰에 sha1 해시를 사용할 수 있습니다. 그런 다음 remember_me_tokens 데이터베이스 테이블 저장소 userID, 토큰의 bcrypt 해시 및 토큰 생성 시간.

그런 다음 누군가 사이트를 방문 할 때 쿠키가 설정되어 있는지 확인하십시오. 쿠키가 설정된 경우 지난 7 일 이내에 데이터베이스에 쿠키에 유효한 행이 있는지 확인하십시오. 쿠키에 대해 데이터베이스에 유효한 행이 있으면 사용자가 로그인했음을 표시하도록 세션을 설정하고 일치하는 쿠키 / 데이터베이스 행을 삭제하고 새로운 쿠키 / 토큰 / 데이터베이스 행을 생성하십시오.

로그 아웃 한 경우 쿠키를 삭제하십시오.

cron 작업을 실행하여 7 일보다 오래된 remember_me_tokens를 제거하십시오.


사용자가이 키를 복사하여 컴퓨터에 붙여넣고 사용자 이름이나 비밀번호없이 계정에 액세스하지 못하게하는 이유는 무엇입니까?
— Jay Simon

열쇠는 어떻습니까? 다른 사람의 컴퓨터에 로컬로 저장됩니다.
— Ryan

당신은 컴퓨터로 걸어와 저장된 파일을 엽니 다 :)
— Jay Simon

2
@JaySimon 컴퓨터를 잠그지 않고 5 분 동안 로그인하여 걸어 나간 사람이나 Remember Me를 클릭하고 누군가가 계정 비밀번호를 뛰어 넘는 사람에게도 동일한 주장을 할 수 있습니다. 이 가능한 보안 상황을 수용 할 수 있다면 그 편의는 훌륭하지만 CIA NOC 목록에 Remember Me 기능이 표시되지 않는 이유입니다. 서버는 클라이언트가 저장해야하는 일종의 토큰을 제공해야합니다. 파일 시스템에서. 더 이상 서버 관점에서 볼 수 없습니다.
— maple_shaft

@maple_shaft 왜 누군가가 당신이 그렇게 할 수 있다는 것에 놀랐습니까? (내 질문에 연결했습니다.)
— Jay Simon

0

기기를 저장 한 기기를 신뢰하는 경우에만 가능합니다. 장치의 보안 수준은 사용자에게 달려 있습니다 (장치에 영향을 줄 수없는 경우). 그것은 당신의 손에서 간단합니다.

의견에 명시된 바와 같이 :

당신이 믿는 것에 관한 것입니다. 컴퓨터 저장소 ID를 신뢰하지 않으면 이것이 문제입니다. 키 체인을 믿으면 이것이 얻을 수있는 최대의 보안입니다. 물론 장치 하드웨어 또는 무언가 감지와 같은 사용자 지정 안전을 추가 할 수는 있지만 모두 가짜 가능하므로 결국 알 수 없습니다. 통제 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.