쿠키 기반 인증은 어떻게 작동합니까?


210

쿠키 기반 인증의 작동 방식을 단계별로 설명해 줄 수 있습니까? 인증이나 쿠키와 관련하여 아무것도 한 적이 없습니다. 브라우저는 무엇을해야합니까? 서버는 무엇을해야합니까? 어떤 순서로? 우리는 어떻게 일을 안전하게 유지합니까?

나는 다른 유형의 인증과 쿠키에 대해 읽었지만 두 가지를 함께 사용하는 방법에 대한 기본 설명을 원합니다. 종종 함께 사용되지만 방법에 대한 설명을 찾을 수 없다는 것을 읽었습니다.


답변:


162

쿠키는 기본적으로 사전에있는 항목입니다. 각 항목에는 키와 값이 있습니다. 인증의 경우 키는 'username'과 같을 수 있으며 값은 username입니다. 웹 사이트를 요청할 때마다 브라우저에 요청에 쿠키가 포함되며 호스트 서버가 쿠키를 확인합니다. 따라서 인증은 자동으로 수행 될 수 있습니다.

쿠키를 설정하려면 요청 후 서버가 보낸 응답에 쿠키를 추가하면됩니다. 그러면 브라우저는 응답을 받으면 쿠키를 추가합니다.

쿠키 서버 측에 대해 만료 시간 또는 암호화와 같은 다양한 옵션을 구성 할 수 있습니다. 암호화 된 쿠키는 종종 서명 된 쿠키라고합니다. 기본적으로 서버는 사전 항목의 키와 값을 암호화하므로 서버 만 정보를 사용할 수 있습니다. 쿠키는 안전합니다.

브라우저는 서버가 설정 한 쿠키를 저장합니다. 브라우저가 해당 서버에 대한 모든 요청의 HTTP 헤더에서 쿠키를 추가합니다. 쿠키를 설정 한 도메인에 대해서만 쿠키를 추가합니다. Example.com은 쿠키를 설정하고 브라우저가 sub.example.com과 같은 하위 도메인으로 쿠키를 다시 보낼 수 있도록 HTTP 헤더에 옵션을 추가 할 수도 있습니다. 브라우저가 쿠키를 다른 도메인으로 보내는 것은 용납 될 수 없습니다.


내가 이해하는 것은 브라우저가 쿠키를 동일한 도메인으로 다시 보낼 수 있다는 것입니다. 이와 관련하여 두 도메인을 구별 할 때 브라우저가 하위 도메인을 고려합니까?
Aakash

1
브라우저가 하위 도메인을 처리하는 방법에 대한 옵션을 HTTP 헤더에서 설정할 수 있습니다.
코너 패트릭

288

나는 이것이 몇 년 늦었다는 것을 알고 있지만 Conor의 답변을 확장하고 토론에 조금 더 추가 할 수 있다고 생각했습니다.

쿠키 기반 인증의 작동 방식을 단계별로 설명해 줄 수 있습니까? 인증이나 쿠키와 관련하여 아무것도 한 적이 없습니다. 브라우저는 무엇을해야합니까? 서버는 무엇을해야합니까? 어떤 순서로? 우리는 어떻게 일을 안전하게 유지합니까?

1 단계 : 고객> 가입

무엇보다 먼저 사용자는 가입해야합니다. 클라이언트는 자신의 사용자 이름과 비밀번호가 포함 된 HTTP 요청을 서버에 게시합니다.

2 단계 : 서버> 가입 처리

서버는이 요청을 수신하고 데이터베이스에 사용자 이름과 비밀번호를 저장하기 전에 비밀번호를 해시합니다. 이렇게하면 누군가 데이터베이스에 액세스 할 수있는 경우 사용자의 실제 비밀번호가 표시되지 않습니다.

3 단계 : 클라이언트> 사용자 로그인

이제 사용자가 로그인합니다. 사용자는 자신의 사용자 이름 / 비밀번호를 제공하고 다시 서버에 HTTP 요청으로 게시됩니다.

4 단계 : 서버> 로그인 확인

서버는 데이터베이스에서 사용자 이름을 찾고 제공된 로그인 비밀번호를 해시 한 후 데이터베이스에서 이전에 해시 된 비밀번호와 비교합니다. 체크 아웃되지 않으면 401 상태 코드전송하고 요청을 종료하여 액세스를 거부 할 수 있습니다. .

5 단계 : 서버> 액세스 토큰 생성

모든 것이 체크 아웃되면 사용자의 세션을 고유하게 식별하는 액세스 토큰을 만듭니다. 여전히 서버에서 액세스 토큰으로 두 가지 작업을 수행합니다.

  1. 해당 사용자와 연관된 데이터베이스에 저장하십시오.
  2. 응답 쿠키에 첨부하여 클라이언트에 리턴하십시오. 사용자 세션을 제한하기 위해 만료 날짜 / 시간을 설정하십시오

따라서 쿠키는 클라이언트와 서버 사이의 모든 요청 (및 응답)에 첨부됩니다.

6 단계 : 클라이언트> 페이지 요청

클라이언트 측으로 돌아가서 로그인했습니다. 클라이언트가 인증이 필요한 페이지를 요청할 때마다 (즉, 로그인해야 함) 서버는 쿠키에서 액세스 토큰을 가져 와서이를 확인합니다. 해당 사용자와 연결된 데이터베이스에서 체크 아웃하면 액세스 권한이 부여됩니다.

시작해야합니다. 로그 아웃시 쿠키를 지우십시오!


10
설명 주셔서 감사합니다. 액세스 토큰이 어떻게 보안을 제공하는지 궁금합니다. 쿠키를 훔치면 공격자가 인증 된 로그인 사용자로 위장 할 수 있습니까? 아니면 SSL로 보호됩니까?
Richeek

6
@Richeek SSL은 요청 / 응답 도중 차단을 보호하지만 공격자는 엔드 포인트 (예 : 브라우저)에서 쿠키에 액세스 할 수 있습니다. 이론적으로 쿠키가 만료 될 때까지 로그인 한 사용자로 표시 할 수 있습니다. 나는 위의 구현이 그것을 처리하지 않기 때문에“이론적으로”라고 말합니다. 위의 구현에서 공격자는 데이터베이스의 액세스 토큰이 업데이트 될 때까지 (즉, 다음 로그인) 액세스 할 수 있습니다.
pllx

14
데이터베이스의 "만료 날짜"를 사용하여 만료시 액세스 토큰을 무효화 할 수 있습니다. 또는 액세스 토큰과 비슷하지만 무엇보다도 토큰 만료를 처리 할 수있는 JSON 웹 토큰 (JWT) 사용을 고려할 수 있습니다. JWT에 대한 자세한 내용은 여기를 참조하십시오. 공격자는 액세스 토큰 / JWT가있는 경우 짧은 시간 동안 계정에 계속 액세스 할 수 있으므로 엔드 포인트도 보호해야합니다.
pllx

3
고맙다는 말을 오래 걸렸습니다!
설명해

4
@ManuChadha 토큰 / 세션 키와 함께 사용자 에이전트와 같은 다른 식별 매개 변수와 함께 사용자의 IP 주소를 저장할 수 있습니다. 요청에 유효한 쿠키가 있지만 잘못된 IP, 브라우저 등이있는 경우 요청을 거부하고 사용자를 로그인 페이지로 리디렉션하여 다시 인증하십시오.
FalcoGer

18

쿠키 기반 인증

쿠키 기반 인증은 다음 4 단계에서 정상적으로 작동합니다.

  1. 사용자는 로그인 양식으로 사용자 이름과 비밀번호를 제공하고 로그인을 클릭하십시오.
  2. 요청이 이루어진 후 서버는 데이터베이스에서 쿼리하여 백엔드에서 사용자의 유효성을 검사합니다. 요청이 유효하면 데이터베이스에서 가져온 사용자 정보를 사용하여 세션을 생성하고 저장합니다. 각 세션마다 세션 Id라는 고유 ID가 생성되며 기본적으로 세션 Id는 브라우저를 통해 클라이언트에 제공됩니다.
  3. 브라우저는 각 후속 요청에 대해이 세션 ID를 제출하고,이 세션 ID를 기반으로 데이터베이스에 대해 세션 ID를 확인합니다. 웹 사이트는 어떤 클라이언트에 속하는 세션을 식별 한 다음 액세스 권한을 부여합니다.

  4. 사용자가 앱에서 로그 아웃하면 세션이 클라이언트 측과 서버 측에서 모두 파괴됩니다.

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