2012-06-04 2 views
7

이것이 일부 사람들에게는 상식 일지 모르겠지만 아직도 배우고 있습니다. 웹 서버에 파일을 동기화하는 iOS 앱이 있습니다. 사용자가 기기에 로그인하면 로그 아웃하지 않는 한 로그인 상태를 유지합니다. 현재 사용자가 파일 추가, 업데이트 또는 삭제와 같은 서버 요청을 시작할 때마다 사용자가 이미 장치에서 인증 되었기 때문에 사용자의 전자 메일 만 보내고 암호는 서버에 보내지 않습니다.모든 서버 요청마다 사용자의 암호를 인증해야합니까?

요청할 때마다 사용자의 저장된 암호를 보내고 요청을 진행하기 전에 서버가 인증하도록해야합니까? 그 이유는 무엇?

답변

5

전자 메일 주소가 아닌 세션 식별자를 보내야합니다.

세션 식별자는 사용자가 성공적으로 인증 될 때 암호화 난수 생성기가 선택한 많은 수 (128 비트이면 충분)입니다. 사용자의 웹 장치에 "쿠키"로 설정되고 보안 채널 (TLS)을 통해 각 요청과 함께 전송됩니다.

이메일 주소는 공개입니다. 비밀번호 나 세션 식별자와 같은 비밀 정보로만 요청을 인증 할 수 있습니다.

+0

그래서 각 사용자는 생성 된 단일 세션 식별자를 갖고 있습니까? 이런 종류의 서버 요청에 대한 고유 한 ID 같은가? 그것은 각 요청에 따라 변하거나 평생의 식별자입니까? 암호 해시는 어떻게됩니까? 대신 사용할 수 있습니까? – Snowman

+0

로그인 할 때마다 새 세션 식별자를 생성합니다. 서버에 대해 무엇을 사용하고 있는지 확실하지 않지만 대부분이 자동으로이를 수행합니다. 핵심은 서버가 로그인하기 전에 세션 id 쿠키 *를 생성하고 비보안 채널을 통해 쿠키를 보낸 경우 로그인시 세션을 무효화하고 새 쿠키를 만들어야한다는 것입니다. 인증 된 모든 요청은 HTTPS를 통해 수행되어야합니다. – erickson

+0

예를 들어 페이스 북의 iOS app..a 사용자는 대개 몇 달 동안 로그인 상태를 유지합니다. 그들은 어떻게했을까요? 사용자가 로그인 한 지 몇 달 동안 동일한 세션 ID를 사용합니까? 이메일이나 비밀 번호를 보내십니까? 사용자를 어떻게 조회합니까? – Snowman

4

은 난 전문가는 아니지만, 여기에 더 나은 해답을 얻을 때까지 몇 가지 팁 : 각 요청이 로그인 세션의 일부입니다 나타 내기 위해 "세션 식별자"의 일종을 포함해야한다

  • 은. 이 식별자는 공격자가 추측하거나 재사용하는 것이 불가능하거나 어렵도록해야합니다. 종종 HTTP 쿠키가이 용도로 사용되지만 URL에 포함 할 수 있습니다.
  • 네트워크를 통해 스니핑하는 사람들이 누구나 볼 수 있으므로 일반 텍스트 암호는 네트워크를 통해 보내면 안됩니다. 대신 일종의 해시 된 암호를 보내거나 챌린지 - 응답 프로토콜을 사용해야합니다.

HTTPS를 사용하고 있다면 걱정할 필요가 없습니다. 암호화되지 않은 트래픽 인 경우 추가 해시 값을 사용하여 각 메시지에 "서명"할 수 있습니다.

2

사용자를 식별하기 위해 이메일 주소를 사용하면 누군가가 기존 사용자 이메일 주소를 사용하여 서비스에 대한 액세스를 위조 할 수 있음을 의미합니다. Kristopher Johnson이 암시 하듯이 세션 식별자를 사용하면 자격 증명이 노출되는 것을 피할 수 있으며 좋은 디자인 선택 일 수 있습니다.

OWASP의 선량한 사람들은 어떤 디자인의 출발점이라도 좋은 session management cheat sheet입니다.

세션 관리 (Java EE, ASP.NET, PHP)가있는 경우 기존 프레임 워크를 사용하는 것이 좋습니다.

-2

SSL을 통과하는 경우 모든 요청에 ​​사용자 이름과 암호를 보내는 것이 가장 좋습니다. 왜? 더 간단한 프로그래밍 인터페이스와 토큰이 실제 가치를 추가하지 않기 때문입니다. 어떤 시점에서 토큰을 얻으려면 자격 증명을 보내야합니다. 매번 자격 증명을 보내든 상관 없습니까? 어느 누구도 SSL을 해독 할 수 없습니다. 이제는 웹 서버 자체와 같은 다른 보안 허점이있을 수 있지만 클라이언트 (보호 된 서버) 로의 전송과는 아무런 관련이 없습니다. 따라서 모든 요청과 함께 사용자/패스가 가장 좋습니다.

와 아이폰 OS 응용 프로그램, 당신은 NSUserDefaults의 자격 증명을 저장할 수 있습니다 (특정 응용 프로그램에 샌드 박스되고 다른 앱이 액세스 할 수 없습니다)

투표를 바랍니다 수락하기 때문에, 다른 답변이 오해의 소지가있다

이제 iOS 앱이 아니며 NSUserDefaults 대신 쿠키에 자격 증명을 저장해야합니다. 그러면 OK를 사용하여 세션을 사용하도록 인수를 지정할 수 있습니다. 하지만 그 세션 이외의 두통 가치가 없습니다!

+0

그것은 서버에서 간단한 프로그래밍 인터페이스가 아닙니다. 대부분의 웹 응용 프로그램 컨테이너는 세션 식별자를 사용한다고 가정하고 자동으로 관리합니다. 괜찮은 HTTP 클라이언트 라이브러리는 비슷한 방식을 제공합니다. – erickson

+1

@erickson 예 실제로 더 간단합니다. 이것을 묘사하십시오. 클라이언트가 토큰을 보냅니다. 서버가 토큰을 돌려 보내지 않습니다. 클라이언트가 새 토큰을 요청해야합니다. 바로 거기에서 또 다른 불필요한 단계가 추가됩니다. – MobileMon

+0

@erickson이 시나리오에서 토큰을 사용할 때의 실질적인 이점을 설명 할 수 있습니까? 아마도 나는 뭔가를 배울 수있다. – MobileMon

관련 문제