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


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.