세션이란 무엇입니까? 그들은 어떻게 작동합니까?


332

파이썬을 사용하여 웹 응용 프로그램 개발을 배우기 시작했습니다. '쿠키'와 '세션'이라는 용어를 접하고 있습니다. 쿠키가 브라우저의 키 값 쌍에 일부 정보를 저장한다는 점에서 쿠키를 이해합니다. 그러나 세션과 관련하여 약간의 혼란이 있습니다. 세션에서도 사용자 브라우저의 쿠키에 데이터를 저장합니다.

예를 들어 - 나는하여 로그인 username='rasmus'하고 password='default'. 이 경우 인증 된 경우 데이터를 확인하고 로그인해야하는 서버에 데이터가 게시됩니다. 그러나 전체 프로세스 중에 서버는 세션 ID를 생성하여 내 브라우저의 쿠키에 저장됩니다. 이제 서버는이 세션 ID를 파일 시스템 또는 데이터 저장소에 저장합니다.

그러나 세션 ID를 기준으로 사이트를 통한 후속 순회 중에 내 사용자 이름을 어떻게 알 수 있습니까? 이 키가 같은 세션 ID 및 세부 사항 일 것 딕셔너리로 서버에 데이터를 저장합니까 username, email값 수 등?

나는 여기에 상당히 혼란스러워지고 있습니다. 도움이 필요하다.


9
"키가 세션 ID가되고 사용자 이름, 전자 메일 등의 세부 정보가 값이되는 메시지로 서버에 데이터를 저장합니까?" ...예. 'dict'은 관계형 데이터베이스 일 수 있지만 기본적으로 작동하는 방식입니다.
bobince

14
나는 웹 세션도 이해하고 싶었다. 도움이된다면 내 위키를 작성하게되었습니다 : machinesaredigging.com/2013/10/29/how-does-a-web-session-work
eloone

모르는 경우 : 비밀번호가 해시 된 경우에도 클라이언트 측에 비밀번호를 저장하는 것이 안전하지 않습니다 (실제로 차이가 없습니다. 크래커는 가짜 쿠키를 생성하여 해시 된 비밀번호를 직접 입력 할 수 있습니다). 로그인 상태를 저장하는 더 좋은 방법입니다.
cytsunny

1
나는 프로토콜 수준의 세부 사항을 사용하여 나 자신을 썼다 -bitspedia.com/2012/05/…
Asif Shahzad

답변:


400

HTTP는 상태가 없으므로 요청을 다른 요청에 연결하려면 HTTP 요청간에 사용자 데이터를 저장하는 방법이 필요합니다.

쿠키 또는 URL 매개 변수 (예 : http://example.com/myPage?asd=lol&boo=no 등 )는 둘 이상의 요청간에 데이터를 전송하는 데 적합한 방법입니다. 그러나 클라이언트 측에서 데이터를 읽거나 편집 할 수 없도록하려는 경우에는 좋지 않습니다.

해결책은 해당 데이터 서버 측을 저장하고 "id"를 제공 한 다음 클라이언트에게 해당 ID 만 알 수 있고 모든 http 요청에서 다시 전달하도록하는 것입니다. 거기서 세션이 구현되었습니다. 또는 클라이언트를 편리한 원격 저장소로 사용할 수 있지만 데이터를 암호화하고 비밀 서버 쪽을 유지합니다.

사람들이 다른 사람의 세션을 가로 채지 않기를 원하거나 세션이 영원히 지속되는 것이 아니라 만료되기를 원하는 등 다른 측면도 고려해야합니다.

특정 예에서, 사용자 ID (사용자 데이터베이스의 사용자 이름 또는 다른 고유 ID 일 수 있음)는 성공적인 식별 후 서버 측 세션 데이터에 저장됩니다. 그런 다음 클라이언트에서받는 모든 HTTP 요청에 대해 세션 ID (클라이언트가 제공 한)는 인증 된 사용자 ID가 포함 된 올바른 세션 데이터 (서버에 의해 저장 됨)를 알려줍니다. 이야기하고 있습니다.


3
"데이터를 클라이언트 측에서 유지하기를 원하지 않습니다." 왜 안돼? 강력한 암호화를 사용하면 클라이언트가 세션 데이터를 암호화하여 쿠키에 저장하도록 할 수 있습니다. 이는 서버가 아무 것도 '기억'할 필요가 없으므로 여러 노드로 확장하는 것을 크게 단순화합니다.
매트 해리슨

5
@MattHarrison 서버 측에서 "기억하지 않고"데이터를 어떻게 해독 하시겠습니까? 어쨌든 내 대답 에서이 주제를 확장하려고했습니다.
Luke404

2
@MattHarrison은 많은 데이터를 사용자 측에 저장하면 트래픽이 증가한다는 점을 명심하십시오.
nitsas 2016 년

5
타사가 사용자의 세션 키를 가로 챌 수있는 경우 사용자 역할을 수행 할 수 없습니까? 사이트가 HTTPS를 사용하지 않는다고 가정하면 키가 암호화되어 있어도 타사가 세션 키를 가진 사용자로 가장 할 수있는 것처럼 보입니다. 서버는 단지 그것을 해독 할 것입니다.
user137717

2
@ user137717 예, 말 그대로 "올바른 세션 ID를 나타내는 모든 세션"에 세션에 대한 액세스를 허용하는 경우 가능합니다. 여러 가지 제한 사항을 적용 할 수 있습니다. 가장 쉽고 가장 일반적인 방법 중 하나는 세션에 클라이언트 IP를 저장하는 것입니다. 다른 IP의 클라이언트가 동일한 세션 ID를 제시하면 세션을 위조하고 삭제 한 것으로 표시합니다.
Luke404

110

유추에 의한 간단한 설명

당신이 당신의 계좌에서 돈을 얻으려고 노력하는 은행에 있다고 상상해보십시오. 그러나 어둡습니다. 은행은 검은 색입니다. 빛이 없으며 얼굴 앞에서 손을 볼 수 없습니다. 당신은 다른 20 명으로 둘러싸여 있습니다. 그들은 모두 똑같이 보입니다. 그리고 모두 같은 목소리를 가지고 있습니다. 그리고 모두 잠재적 인 나쁜 사람입니다. 즉, HTTP는 상태 비 저장입니다.

이 은행은 재미있는 유형의 은행입니다. 논쟁을 위해 일이 어떻게 작동하는지 여기에 있습니다.

  1. 당신은 줄을 서서 (또는 온라인으로) 당신과 거래원에게 이야기합니다 : 돈을 인출하라는 요청을 한 다음,
  2. 소파에서 잠시 기다려야하고 20 분 후에
  3. 당신은 가서 출납원으로부터 실제로 돈을 모아야합니다.

하지만 텔러는 어떻게 다른 사람들과 구분할 수 있습니까?

출납원은 당신을 보거나 쉽게 알아볼 수 없습니다. 불이 모두 꺼 졌기 때문에 기억하십시오. 당신의 텔러가 다른 사람에게 $ 10,000의 인출을한다면 – 잘못된 사람?! 출납원이 귀하를 인출 한 사람으로 인식 할 수 있어야 요청한 돈 (또는 자원)을 얻을 수 있습니다.

해결책:

당신이 처음으로 출납원에게 나타나면, 그 또는 그녀는 당신에게 비밀로 무언가를 알려줍니다 :

"당신이 나에게 말을 할 때마다, 당신은 먼저 자신을 GNASHEU329로 식별해야합니다.

그 누구도 비밀 암호를 모른다.

현금 인출 방법의 예 :

그래서 나는 가서 20 분 동안 휴식을 취하기로 결정했다가 나중에 출납원에게 가서 "출금을 받고 싶다"고 말합니다.

텔러가 나에게 묻습니다. "당신은 누구십니까 ??!"

"저는 George Banks입니다!"

"증명!"

그리고 나는 그들에게 내 암호를 알려줍니다 : GNASHEU329

"확실히 Mr Banks!"

기본적으로 세션이 작동합니다. 수백만의 바다에서 하나를 고유하게 식별 할 수 있습니다. 출납원을 대할 때마다 자신을 식별해야합니다.

궁금한 점이 있거나 확실하지 않은 경우 의견을 게시하면 해결해 드리겠습니다.

사진을 통한 설명 :

그림을 통해 설명 된 세션


9
이 설명을 좋아하십시오-당신의 비유에서 다른 ppl이 도청하는 것을 어떻게 막고 발신자가 알려주는 비밀 암호를 듣는가? 즉, session_id를 도난당한 경우 누군가가 자격 증명을 모방 할 수 없습니까?
17

@ wmock session hijacking은 확실히 문제입니다 : 이것을 확인하십시오! owasp.org/index.php/Session_hijacking_attack
BKSpurgeon

2
사랑스러운 예 !! 그것은 배우기를 찾고있는 간절한 마음과 공유 될 것입니다!
Victor

비유로, GNASHEU329사용자 비밀번호는 특정 시간까지 만료되는 인증 토큰을 생성합니다. Mrs Banks는 auth 토큰을 사용하여 텔러에게 암호를 반복적으로 제공하지 않고도 여러 번의 인출을 할 수 있습니까?
Daniel Lizik

@DanielLizik 당신은 데프입니다. 개념 이해! 그러나 나는 당신에게 지능적인 답변을 줄 수있는 토큰 기반 워크 플로우에 대해 충분히 알지 못합니다. 일반적인 원칙은 서버가 요청한 사람을 식별 할 수 있어야한다는 것입니다.
BKSpurgeon

39

"세션"은 사용자가 웹 사이트를 탐색하는 시간을 나타내는 데 사용되는 용어입니다. 사이트의 페이지에 처음 도착한 후 사이트 사용을 중단 할 때까지의 시간을 나타냅니다. 실제로 사용자가 언제 사이트를 완료했는지 알 수 없습니다. 대부분의 서버에는 동일한 사용자가 다른 페이지를 요청하지 않는 한 세션을 자동으로 종료하는 시간 초과가 있습니다.

사용자가 처음으로 일종의 세션 ID를 연결할 때 생성되는 방법은 웹 서버 소프트웨어 및 사이트에서 사용중인 인증 / 로그인 유형에 따라 다릅니다. 쿠키와 마찬가지로 보안 문제이기 때문에 일반적으로 더 이상 URL로 전송되지 않습니다. 대신에 집합 적으로 세션이라고도하는 다른 많은 것들과 함께 저장됩니다. 세션 변수는 쿠키와 유사합니다. 쿠키는 페이지 요청과 함께 전송되어 서버에서 페이지와 함께 반환되는 이름-값 쌍이지만 이름은 웹 표준으로 정의됩니다.

일부 세션 변수는 HTTP 헤더 로 전달됩니다 . 그들은 모든 페이지 탐색의 장면에서 앞뒤로 전달되므로 브라우저에 표시되지 않으며 모든 사람에게 비공개 정보를 알려줍니다. 그중에는 USER_AGENT 또는 페이지를 요청하는 브라우저 유형, REFERRER 또는 요청중인 페이지에 연결된 페이지 등이 있습니다. 일부 웹 서버 소프트웨어는 자체 헤더를 추가하거나 서버 소프트웨어에 특정한 추가 세션 데이터를 전송합니다. 그러나 표준은 잘 문서화되어 있습니다.

희망이 도움이됩니다.


사용하는 IIS 서버에서 USER_NAME 헤더에서 사용자 이름을 얻을 수 있지만 IIS에 따라 다를 수 있습니다.
Tim Rourke

REFERRER는 여기서 무엇을 의미합니까?
Gab 是 好人

@Gab 是 好人 REFERRER는 일반적으로 클라이언트가 "Referer"HTTP 요청 헤더에서 보내는 임의의 문자열을 의미합니다. 여기 에는 클라이언트를 현재 리소스로 참조한 리소스의 URL 포함 되어야 합니다.
Luke404

감사합니다, 그것은 해야 하므로 반드시. 그래서 사람들은 종종 RFC에서 제안한 것과 다른 의미 로이 헤더를 사용한다고 생각합니다.
Gab 是 好人

먼저 쓴 Like cookies, this usually doesn't get sent in the URL anymore다음과 Session variables are like cookies - they're name-value pairs sent along with a request for a page. 정확히 어떻게 되나요? 다음에 요청하면 전송됩니까?
KPMG

19

HTTP는 상태 비 저장 연결 프로토콜입니다. 즉, 서버는 다른 사용자의 다른 연결을 구별 할 수 없습니다.

따라서 쿠키가옵니다. 일단 클라이언트가 서버에 처음 연결되면 서버는 새 세션 ID를 생성하고 나중에이 쿠키를 클라이언트에 쿠키 값으로 보냅니다. 이제부터이 세션 ID는 해당 클라이언트 연결을 식별합니다. 각 HTTP 요청 내에서 쿠키 내에 적절한 세션 ID가 표시되기 때문입니다.

이제 각 세션 ID에 대해 서버는 일부 데이터 구조를 유지하므로 사용자에게 고유 한 데이터를 저장할 수 있습니다.이 데이터 구조는 세션을 추상적으로 호출 할 수 있습니다.


1
"각 세션 ID에 대해 서버는 일부 데이터 구조를 유지하므로 사용자에게 고유 한 데이터를 저장할 수 있습니다.이 데이터 구조는 추상적으로 세션을 호출 할 수 있습니다." 서버는 어떤 특정 클라이언트 정보를 저장합니까?
realPK

"각 세션 ID에 대해 서버는 일부 데이터 구조를 유지하므로 사용자에게 고유 한 데이터를 저장할 수 있습니다.이 데이터 구조는 추상적으로 세션을 호출 할 수 있습니다." 서버는 어떤 특정 클라이언트 정보를 저장합니까?
Gab 是 好人

위와 같은 질문도 답변하면 도움이 될 것입니다.
Suraj Jain

4

단기간 메모리 손실이있는 사람 (A)으로 HTTP를 생각하고 그 사람이 시야를 벗어나 자마자 모든 사람을 잊어 버리십시오.

이제 다른 사람을 기억하기 위해 A는 그 사람의 사진을 찍어 보관합니다. 각 개인의 사진에는 ID 번호가 있습니다. 그 사람이 다시 시야에 들어 오면 그 사람은 자신의 ID 번호를 A에게 알리고 A는 자신의 사진을 ID 번호로 찾습니다. 그리고 !!, A는 그 사람이 누구인지 알고 있습니다.

HTTP도 마찬가지입니다. SHORT TERM MEMORY LOSS로 고통 받고 있습니다. 세션을 사용하여 웹 사이트를 사용하는 동안 수행 한 모든 작업을 기록 한 다음 다시 올 때 쿠키의 도움으로 쿠키를 식별합니다 (쿠키는 토큰과 같습니다). 사진은 세션이고 ID는 쿠키입니다.

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