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


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.