쿠키와 세션을 왜 사용할까?
서버와 클라이언트가 통신을 할 때마다 서버는 클라이언트가 누구인지 알아야 한다.
HTTP는 connectionless, stateless라는 특성이 있다.
connectionless는 말 그대로 비연결성인데 클라이언트 요청 후 서버가 응답을 하면 연결이 끊어진다.
자기 할 일이 끝나면 뒤도 안돌아본다.
stateless는 비상태성이다.
상태 정보를 저장하지 않는다.
로그인되어 있는 사이트를 껐다가 켜면 다시 로그인을 해야 하는 경우가 예시다.
이런 특성들에 의해서 사용자는 매번 서버에 자신이 누군지 알려야하는 불편을 겪는다. 보완하기 위해 쿠키와 세션을 사용한다.
쿠키와 세션의 공통점은 요청하는 클라이언트가 누군지 인증할 때, 즉 서버라는 놈이 요청한 클라이언트가 누군지 확인이 필요할 때 사용한다는 것이다.
쿠키와 세션의 간단 차이점
- 쿠키는 클라이언트(브라우저)에 저장된다.
- 세션은 서버에 저장된다.
쿠키 Cookie
1. 클라이언트(브라우저)에 저장되는 정보다.
2. 요소
- 이름: 쿠키 식별용
- 값: 쿠키값
- 유효시간: 이 시간이 지나면 쿠키가 삭제된다.
- domain: 어떤 도메인에서 쿠키를 사용할 지 지정
- ex: 'Domain=Domain; Domain=abc.com' abc.com이라는 도메인에서 쿠키가 살아 있음
- path: 특정 경로에 쿠키를 지정할 수 있음(지정된 path의 하위 path에서도 쿠키가 살아있음)
- ex: 'Path=Path; Path=/cookie'
특정 사이트에서 로그인한 뒤 브라우저의 인터넷 사용 기록 삭제에서 쿠키 삭제를 하고 새로고침하면 로그아웃되어 있다. 팝업창에서 일주일간 보지 않기를 체크하고 쿠키 삭제를 하면 팝업이 다시 뜬다. 쿠키를 사용해서 상태를 유지하기 때문이다.
3. 동작 방식
- 클라이언트가 서버에 요청
- 서버에서 쿠키 생성
- 서버는 HTTP 헤더에 만들어진 쿠키를 담아서 응답을 보냄 (유효시간 내에는 쿠키가 살아있음)
- 클라이언트가 서버에 요청 시 쿠키를 갖고 있다면 HTTP 헤더에 쿠키를 담아서 요청함
- 서버에서 쿠키 갱신이 필요하면 갱신된 쿠키를 HTTP 헤더에 담아서 응답
세션 Session
1. 서버에 저장되는 값이다.
2. 세션 ID는 서버에서 발급하지만 클라이언트에 저장된다.
3. 클라이언트가 서버에 요청 시 서버는 서버의 세션 ID와 클라이언트의 세션 ID가 일치하는지 확인한다. 그리고 서버는 아 이 클라이언트 놈이 이 세션을 할당받은 놈이구나 하고 알게 되는 것이다. 즉 세션 ID는 서버의 세션을 사용할 수 있는 클라이언트인지 확인하기 위한 수단인 것이다. 이렇게 되면 매 서버 요청 시마다 세션 ID로 클라이언트 자신이 누군지 인증하게 되고 매번 로그인을 할 필요가 사라지는 것이다.
세션을 사용할 때 서버에서는 동일한 key를 가지고 클라이언트들의 쿠키들을 읽는데 이게 어떻게 가능할까?
서버는 클라이언트마다 세션ID를 각각 부여하기 때문에 구분이 가능하다. 서버가 갖고 있는 세션ID와 요청 헤더에 있는 쿠키에 담긴 세션ID가 일치하는지 아닌지를 판단한다.
세션 쿠키는 서버가 발행해서 클라이언트에 응답 시 넘긴다. 클라이언트는 서버에 요청 시 쿠키를 헤더에 담아 보낸다.
세션 ID는 쿠키에 담긴다. 만약 세션 ID를 URL parameter에 넣으면 중간에 해커가 값을 가로채서 위변조할 수 있기 때문에 상대적으로 해킹이 어려운 암호화된 값인 쿠키에 세션 ID를 싣는 것이다.
쿠키와 세션의 차이
1. 쿠키는 클라이언트에 저장된다.
2. 세션은 서버에 저장된다. 그러나 클라이언트를 구분하는 세션 ID는 서버와 클라이언트 양측 모두에 저장된다.
3. 서버에 정보를 저장하는 세션이 쿠키보다 보안이 더 좋다.
4. 속도는 쿠키가 더 빠르다. 쿠키는 정보를 직접 서버에 갖다주지만 세션은 클라이언트가 맞는지 확인하고 서버측에서 정보를 사용하기 때문이다.
OAuth
토큰 기반의 사용자 인증 방식이다.
쿠키는 사용자 컴퓨터가 해킹당할 수 있으니 보안에 취약하고 그보다 나은 세션도 중간에 해킹당할 우려가 있다. 또한 세션은 서버에 부하를 줄 수 있다.
이런 문제들을 보완하기 위해 토큰이 나왔다.
구글, 페이스북, 네이버와 같은 웹 서비스로부터 토큰을 발급 받아서 타 서비스의 계정으로 로그인할 수 있는 것이다.
대학생 시절 수강신청을 할 때 크롬, 익스플로러를 동시에 켜놓고 수강신청 사이트에 접속했었는데 서버가 브라우저마다 세션 ID를 전송해주고 브라우저는 받아온 세션 ID를 각각 저장하기 때문에 가능했던 것 같다.
참고 https://victorydntmd.tistory.com/34?category=719464
https://opentutorials.org/course/3387/21745
http://www.lassosoft.com/Tutorial-Understanding-Cookies-and-Sessions
https://stackoverflow.com/questions/36175970/what-is-the-concept-of-saving-session-id-in-cookie
https://stackoverflow.com/questions/5593359/where-does-session-save
'과목 > 컴퓨터 네트워크' 카테고리의 다른 글
네트워크 모델 (0) | 2019.08.23 |
---|---|
인터넷 기초 지식 (0) | 2019.08.23 |
OSI 7 Layer (0) | 2019.07.23 |
19장 최소비용 알고리즘 - 다익스트라, 벨만-포트 알고리즘 (0) | 2017.11.10 |
17장 무선 전송 기법 - Barker Sequence (0) | 2017.10.25 |