Server/Django issue

2. 쿠키와 세션 (cookie and session)

개발자킹콩 2020. 9. 23. 17:39

우리가 웹페이지에 접근을 할 때 로그인이 되어 있을 때와 로그인이 되어있지 않을 때는

다양한 것들이 다르게 반응한다. 권한도 다르고 해당 페이지도 다르게 나타날 수 있다.

그렇다면 로그인 후에는 웹페이지를 돌아 다닐때마다 로그인을 했다는 표시인

열쇠?키? 같은 것을 들고 다니는 듯하다. 그것이 아니라면 페이지마다 로그인을 해야겠지.

그럼 쿠키와 세션은 무엇을 뜻하는 걸까? 좀 더 파헤쳐 보자!!!!

https://interconnection.tistory.com/74

 

 

 

1. 전체 동작원리 (쿠키이용, 세션이용)

자! 우리는 지금 웹페이지에서 어떻게 동작하는지 보자!

내가 네이버에 들어가기 위해 naver.com을 검색하면 naver의 서버에 내가 요청을 하게 된다.

그럼 서버에서는 해당페이지를 나한테 응답하고 그것을 화면에 띄워주는 것이 큰 틀이다.

 

웹페이지가 동작을 할 때 Client(고객)은 웹 브라우져이고 이 안에는 Cookie라는 저장소가 존재한다.

저장소니깐 유용한 정보를 담고 있겠구만!!!

이 Cookie를 활용해서 데이터를 유지하게 된다.

 

처음 웹페이지 ( naver.com ) 를 열게 되면, 사용자(Client)는 서버(Server)에게 페이지를 얻기위해 요청을 한다.

그런데 이 요청을 할 때에는 Cookie라는 저장소의 정보도 같이 보낸다.

(음~ 서버에서 이 정보로 무엇인가를 확인하는것 같구만)

그럼 이때는 Cookie에는 지금까지 아무 작업을 안 했기에 비어있겠지.

 

그렇게 되면 서버는 사용자를 구분할 Key를 문자열로 만들고,

이것을 DB에 해당 사용자에 대한 정보를 등록하고, 사용자에게 응답(웹페이지)를 준다.

이 응답에는 HTTP의 header라는 위치에 쿠키정보(Key)를 넣어서 준다.

이 Key가 session ID이다.

(참고로 인터넷은 HTTP를 통해 통신한다. 이렇게만 참고하자!!)

 

그럼 사용자(Client)는 header를 통해 받은 Key(session ID)를 보고

"naver.com에서는 이 Key를 쓰면 되는구나" 를 인지하게 되고,

이 쿠키정보의 Key를 자신의 안에 존재하는 쿠키에 저장한다.

사용자(Client)에서는 웹사이트 별로 나누어 이 Key(session ID)를 저장한다.

 

Chrome에서 naver에 대한 쿠키

 

 

그리고 다음에 해당 페이지를 들어갈 때 요청을 보내게 되면 이 쿠키정보를 같이 잘 포장해서 보낸다.

서버는 그 쿠키안의 session 정보를 보고 "아까 그 클라이언트구나!" 하고

DB에서 원하는 데이터 정보를 꺼내서 사용할 수 있게 된다.

 

 

쿠키의 사용 예

  • 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"
  • 쇼핑몰의 장바구니 기능
  • 자동로그인, 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크, 쇼핑몰의 장바구니
  • 페이지를 끄고 다시 그 페이지에 들어갔을 때 로그인이 유지되어 있는 것도 웹브라우져(client)에서 서버에서 사용할 Key정보를 쿠키에서 유지하고 있기 때문이다

 

 

2. 로그인

서버에서는 클라이언트를 구별해서 인지할 수 있고

클라이언트에서 유지해야 하는 데이터가 있을때(로그인이라고 가정하면),

클라이언트에서 로그인을 완료했다면,

서버에서는 로그인정보(사용자 정보)를 갖고 있어야 한다.

 

사용자 A가 로그인 해서 게시판에 글을 적으면

서버에서는 현재 글을 적은 유저가 사용자A 라는 것을 알고 있어야한다.

 

그 정보는 서버에 달라 붙어있는 DB라는 저장소에 있다.

그런데 로그인 요청을 하면 DB에서는 어떤 데이터를 저장할까?

바로 ID 이다.!!!! (하나로 딱 떨어지는 것이 ID이고, 이것만 있으면 나머지 데이터도 불러올 수 있다.)

이렇게 하나도 떨어지는 key를 private key (pk) 라고 한다.

 

서버는 클라이언트가 들어오면 그 요청(request)안에 같이 담겨온 Cookie라는 저장소를 확인하고,

그 안에 key정보가 있으면, 그것으로 부터 DB를 확인한다.

여기서 DB를 확인 했을때 "로그인 되어있는 사용자 정보가 있음" 이라고 되어있다면,

로그인 유지상태로 페이지가 뜨게 되고 그에 맞는 권한과 페이지를 응답할 것이다.

 

 

3. session

[출처] https://hashcode.co.kr/questions/3243/%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98%EC%97%90-%EA%B4%80%ED%95%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4

 

세션에 대해 조금더 배우자!! Cookie와 Key에 대한 설명위주로!!
home의 계발자 도구에서 Application을 살펴보자
Cookie에서는 이 사이트에서 어떤 쿠키를 사용하는지를 알 수 있다.

(웹브라우져, 클라이언트에 쿠키가 있으니깐 당연하겠지)

 

session id는 언제 만들어 졌냐?

나의 웹브라우져는 클라이언트에 해당하기에 처음 요청을 하게 되면 서버에서는 해당 client에게

고유한 id를 생성하여 클라이언트에게 HTTP header에 담아서 session id를 전달(응답)하게 된다. 

클라이언트 응답을 받을때 쿠키에 session id를 받아서 저장하고 있다.

이 session id가 private key에 해당하는 데이터다.
이렇게 되면 다음 요청을 할 때마다 이 쿠키정보도 같이 보내면서 요청을 한다.

 

이 session id는 각각의 브라우져 마다 식별자 역할을 한다.
시크릿모드로 다른 웹브라우져로 home로 들어가면 쿠키는 비어있다.
로그인을 하게 되면 새로운 session id를 발급받고, 서로 다른 웹브라우져이기에
서로 다른 session id를 부여받게 된다. 각 브라우져는 다른 session공간을 갖고있다.

크롬과 파일폭스는 다른 session공간을 갖게 된다.

예를 들어 내가 크롬으로 네이버에 로그인이 되어있을 때, 껏다가 들어가도 로그인이 유지되는 경우가 존재하지만,

크롬로그인 시켜놓고 파일폭스로 네이버에 들어가면 로그인은 절대 안되있다는 것을 의미한다.

 

 

 

 

4. Session과 Cookie의 차이점

(1) 쿠키를 상태유지로 사용

[출처] https://hashcode.co.kr/questions/3243/%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98%EC%97%90-%EA%B4%80%ED%95%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4

 

(2) 세션을 상태유지로 사용

[출처] https://hashcode.co.kr/questions/3243/%EC%BF%A0%ED%82%A4%EC%99%80-%EC%84%B8%EC%85%98%EC%97%90-%EA%B4%80%ED%95%9C-%EC%A7%88%EB%AC%B8%EC%9E%85%EB%8B%88%EB%8B%A4

 

로그인과 같은 상태유지의 경우 이렇게 쿠키와 세션으로 사용가능하지만 우리는 세션을 사용하는 것을 배웠다.

 

차이점

  • 쿠키의 경우 세션보다 더 빠른 속도로 요청과 응답를 얻을 수 있다.
  • 세션의 경우 서버에서 id로 관리하기에 보안에 더욱 효과적이다.
  • 세션의 경우 서버에 데이터를 계속 유지하고 있기에 사용자가 많아지면 성능이 떨어지게 된다.

 

 

이상!! 오늘도 감코!!!