2011-06-14 7 views
6

영구 로그인을 위해 브라우저의 쿠키에 사용자의 인증 정보를 저장하고 싶습니다. 그들이 말했듯이 쿠키에는 비밀 정보 (예 : 비밀번호)를 저장하는 것이 결코 안전하지 않지만 '비밀번호 저장'과 같은 옵션을 사용하려면 다른 선택의 여지가 없다고 생각합니다.쿠키에 로그인 정보 저장

사용자가 자신의 로그인 정보를 기억하고 비밀번호가 아닌 사용자 이름 (이메일)을 저장하고 있지만 쿠키의 해시 된 DB ID와 같은 몇 가지 고유 정보가있는 경우. 쿠키에 저장된 해시 된 ID가 쿠키에 저장된 사용자의 이메일과 일치하는지 확인해야합니다. 누구나 브라우저에 저장된 쿠키를 쉽게 볼 수 있다고 생각합니다 (예 : Firefox, 옵션 -> 쿠키).

사람이 컴퓨터에서 쿠키를 읽는 것만큼이나 약하다. 그러면 다른 컴퓨터에서 쿠키가 그 정보로 설정되어 로그인하게됩니다. (스크립트가 저장된 이메일과 해시 된 ID를 데이터베이스로 검사하므로 일치 할 것입니다.)

데이터베이스의 다른 정보 (예 : 세션 ID 등)를 저장하지 않고도이 접근법을 조금 개선 할 수 있습니까? 감사합니다.

+1

당신이 고려하고 싶은 한 가지 접근법은 쿠키에 사용자의 ID를 저장하는 것뿐 아니라 인증되지 않은 쿠키를 유지하는 것입니다. ID 쿠키가 있지만 인증 된 쿠키가없는 사용자는 시스템을 탐색 할 수 있지만 처음 시도 할 때 암호를 입력하라는 메시지가 표시됩니다. 암호가 맞으면 인증 된 쿠키가 설정되고 사용자에게 다시 묻지 않습니다. 쿠키가 지속되지 않으므로 인증은 세션이 끝날 때까지 지속됩니다. – GordonM

+0

@ GordonM, 고마워, 나는 amazon.com이 같은 접근법을 가지고 있다고 생각한다. 쿠키에 액세스하면 이메일 + 및 일부 해시 정보를 말하고, 브라우저에서 쿠키를 설정하는 것이 얼마나 어려운지 알고 싶습니다. – Roman

+0

나는 쿠키를 거의 저장하지 않을 것이다. 영속 ID 쿠키는 해당 사용자의 ID 만 사용하고 비 영구적 인 인증 쿠키는 true 또는 false 중 하나입니다. 스누핑 해커가 계속해야하는 ID 만 보내는 것처럼 작업을 수행하는 데 절대적으로 필요한 것보다 더 많은 쿠키를 저장하는 것을 피하십시오. 반면 해커가 어떻게 정보를 얻는 지에 대한 자세한 정보를 보내면 시스템 공격. – GordonM

답변

11

다른 옵션이 있습니다.

각 사용자는 로그인하여 기억을 요청할 때 긴 임의의 문자열을 만듭니다.

사용자에게 제공 한 쿠키에 userId와 함께이 문자열을 저장합니다.
문자열에 올바르게 소금에 절인 해시를 데이터베이스에 저장하십시오.

사용자가 remember-me 쿠키를 제공하면 임의의 문자열을 데이터베이스에있는 해시 된 검증기와 일치시킵니다 (마치 비밀번호가있는 것처럼).

일치하는 경우 사용자를 로그인하고 이에 대한 새로운 remember-me 쿠키를 만듭니다.
일치하지 않는 경우 -> 사용자 이름과 비밀번호를 요청하십시오.

0

서버의 고유 키를 사용하여 사용자 이름 (이 경우 전자 메일)을 암호화하고 인증 쿠키에 저장하는 것이 좋습니다. 쿠키가 훼손되면 암호 해독에 실패하고 로그인에 실패하게됩니다.

인증 쿠키를 다른 컴퓨터 (또는 다른 브라우저)에 복사하면 (수동으로 쿠키 또는 XSS로 설정) 사용자는 새 컴퓨터에도 로그인됩니다. 이러한 위험을 줄이기 위해 컴퓨터에 대한 고유 한 정보 (예 : IP 주소)를 추가하는 것을 고려해 볼 수 있습니다.

는 .NET에서 인증 쿠키에 대한 explaination,하지만 난 개념뿐만 아니라 PHP에서 작동 생각 : 그것은에 사용자 정보를 저장할 때 이 http://support.microsoft.com/kb/910443

0

당신은 선택의 여지가 너무 많이하지 않습니다 클라이언트 측 ...

클라이언트 IP를 키로 사용하여 일부 암호화를 시도 할 수 있습니다. 쿠키가 해커 컴퓨터에 복사 되더라도 IP가 암호화의 핵심임을 알지 못하면 사용자 정보를 일부 하강 보호합니다.

는 증거

그래서 일부 해독 가능한 암호화를 찾아서이해야 ... 당신이 사용자 검증 시스템 throught를 가야 할 또 다른 연결 지점에서 로그인 할 때마다 페이스 북이 이런 식으로 일을하고있다

입니다 당신의 일)

+4

모호함을 통한 보안은 전혀 보안되지 않습니다. – Gumbo

+1

나는 이것을 기억할 것이다 ^^ – MaxouMask

0

"나를 기억"만드는 방법에 대한 좋은 기사가 더 안전한 쿠키 : 나는 PHP 라이브러리에있는 문서에 기술 된 방법을 구현 한 http://jaspan.com/improved%5Fpersistent%5Flogin%5Fcookie%5Fbest%5Fpractice

: https://github.com/gbirke/rememberme는, 아마도 당신은 사용할 수 있습니다 참조로.

Firesheep의 경우 세션 고정 및 쿠키 도용은 실제 문제입니다. 이에 대한 유일한 방어책은 SSL로 사이트를 보호하고 XSS 결함을 모니터링하는 것입니다.

보안을 향상시키는 또 다른 방법은 "Remember me"쿠키로 로그인 한 사용자가 로그인 자격 증명을 주문하거나 변경하는 것과 같은 "위험한"작업을 할 때 다시 인증하도록하는 것입니다.The definitive guide to form-based website authentication

+1

불행히도, 첫 번째 링크 된 기사에서 제안 된 개선 사항은 개선되지 않습니다. 그들은 다음에 대한 반응으로 쓰여진 곳 : http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/하지만 슬프게도 그들은 잘못되었습니다. – Jacco

+0

그 이유를 설명해 주시겠습니까? – chiborg

+0

설명 상자에 충분한 공간이 없어서 자세히 설명 할 수 없습니다.그것에 관한 일부 토론은 어항 기사 아래뿐만 아니라 [웹 사이트 인증에 대한 확실한 안내서] (http://stackoverflow.com/questions/549/the-definitive-guide-to-website-authentication/)에 대한 의견에도 있습니다. 477579 # 477579). – Jacco

0

당신은 또한 만료 타임 스탬프와 사용자 ID와 세션 ID와 쿠키를 설치할 수 :

는 더 많은 자원의 경우,이 질문을 참조하십시오. 그런 다음 쿠키를 IP 또는 호스트 이름 (또는 두 가지 모두 모두)에 바인딩하면 쿠키 도용 기 및 기타 물건으로부터 매우 안전합니다.

0

은 내가

다시 생각에는 다른 선택의 여지가 없다 생각합니다.

세션을 유지하려면 암호 클라이언트를 저장할 필요가 없습니다. 'remember me'연산은 똑같습니다. 서버에 저장된 데이터의 조회 키인 임의의 값을 사용하십시오.

암호 문구가있는 클라이언트 측 인증서를 사용하지 않으면 사안을 복잡하게 만들면 보안이 향상되지 않고 고객의 개인 데이터가 노출 될 가능성이 높아집니다.

관련 문제