문제

PHP 기반 로그인 시스템을 개발하고 있습니다. 각 사용자에게는 ID (숫자)와 암호가 있으며 소금에 절인 해시로 저장됩니다.

로그인이 성공했는지 여부를 알 수 있지만 이제는 해당 정보를 어딘가에 저장해야합니다 (사용자가 영구적으로 로그 아웃하지 않도록).

과거에는 $ _session 변수와 함께 연주했습니다. 그러나 사용자가 브라우저를 떠나면 원하지 않는 경우 삭제되는 것 같습니다. 또한 사용자가 시스템을 속이려고하지 않는다고 "가정 할 수 없으므로 안전해야합니다.

그래서 여기 내 질문이 있습니다.

  1. 내가 사용해야할까요 $_SESSION 또는 $_COOKIE? 이러한 각 접근법의 주요 장점은 무엇입니까?
  2. '기억'확인란을 구현하는 방법?
  3. 세션/쿠키 변수에 어떤 정보가 저장되어야합니까?

이 특정 질문에서는 데이터베이스 보안 문제가 고려되지 않습니다.

3 번에 관해서는, 내가 의미하는 바는 다음과 같습니다.

  • 쿠키/세션에 사용자의 ID와 해시 비밀번호를 저장해야합니까?
  • 쿠키/세션에 사용자의 ID와 보수되지 않은 비밀번호를 저장해야합니까?
  • "sessionID"와 암호 (해시 또는 부가가 없는가?)를 저장해야합니까?
  • "SessionID", "ID"및 비밀번호를 저장해야합니까 (다시 한 번 해시 또는 해시가 없음)?

내 웹 사이트를 가능한 한 안전하지만 효율적이며 사용자 친화적으로 유지하고 싶습니다. SessionID 기반 접근 방식이 취해지면 데이터베이스에 저장하는 방법에 대한 설명도 감사합니다.

미리 감사드립니다

편집 : Eran과 Brian의 답변이 결합 된 것 같습니다. 불행히도, 나는 그들 중 하나를 받아 들인대로 표시 할 수 있습니다. 나는 어떤 것이 더 유용한 지 확인하기 위해 계속해서 구현하려고 노력할 것입니다.

도움이 되었습니까?

해결책

에란의 요점을 반복하고 싶습니다 절대 세션 또는 쿠키 데이터에 사용자 비밀번호 또는 암호 해시를 저장하십시오.

일반적으로 쿠키를 사용하여 웹 앱에서 Remember ME 기능을 구현했습니다. "안전한"영구 로그인 시스템을 구축하기위한 정보를 시작하기에 좋은 곳은이 것입니다. Fishbowl의 블로그 게시물. 심층적 인 대답은 이미 다루었습니다 또 다른 스택 오버 플로우 답변.

로그인이 안전한지 확인 해야하는 경우 HTTPS를 사용해야합니다. 쿠키 나 세션이 암호화되지 않으면 도난 당할 수 있기 때문입니다.

따라야 할 또 다른 모범 사례는 2 레벨 로그인 시스템입니다. 아마존과 같은 사이트 에서이 내용을 볼 수 있습니다. 여기서 로그인하지 않고 카트에 물건을 추가 할 수 있지만 어떤 방식으로 계정을 체크 아웃하거나 편집하려면 다시 비밀번호를 입력해야합니다.

다른 팁

민감한 정보 (즉, 인증 결과)의 경우 세션 만 사용합니다. 세션은 서버쪽에 저장되어 있으며 타협 할 가능성이 훨씬 적습니다.

세션 수명과 관련하여 기본값은 브라우저 세션의 수명이지만이를 제어 할 수 있습니다. 다음에 영향을 미치는 몇 가지 설정이 있습니다.

session.gc_maxlifetime- 세션의 수명을 효과적으로 제어합니다.

session.gc_probability 및 session.gc_divisor 함께 세션 가비지 컬렉션이 얼마나 자주 발생하는지를 결정합니다.

그리고 마지막 - session.cookie_lifetime 세션 쿠키의 수명을 제어합니다 (세션 ID를 보유하는 쿠키는 URL을 통해 트랜스미스트 할 필요가 없습니다). 세션의 값과 일치해야합니다 .gc_maxlifetime.

또한 세션이나 쿠키로 암호를 저장하지 마십시오 (해시 형식으로도). 인증 결과.

ID를 $ _session에 저장하지만 해시 또는 해시가없는 비밀번호를 저장하지 마십시오. 사용자가 로그인하고 ID가 $ _session으로 저장되면 더 이상 비밀번호가 필요하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top