지난 포스팅 3.1 ~ 3.3에 걸쳐 계정(account)을 생성하는 기능을 웹 서비스 안에 구현해보았다. 계정을 생성하는 제일의 목적은 서비스에 로그인하여 웹 서비스로부터 차별화된 서비스를 제공받는 것이다. 이제 로그인/로그아웃 기능, 좀 더 일반적인 표현으로 계정 인증(account authentication: 접속한 사용자가 인증을 통해 권한을 부여받는다는 의미) 기능을 만들어보자.
계정 인증 기능을 구현하기 전에 계정 인증에 필요한 내용을 몇 가지 먼저 살펴보는 기회를 갖자. 웹 서비스를 서버와 클라이언트(사용자) 관점에서 바라보면 웹 서비스는 사용자의 페이지 요청(HTTP request)에 대해 서버가 응답하는(HTTP response) 구조로 되어있다.
즉, 사용자가 웹 서비스의 페이지를 돌아다닌다는 의미는 원하는 페이지의 주소(대부분의 경우 페이지 안에 링크로 포함되어 있다)를 서버에 보내고 서버가 링크 주소에 해당하는 페이지를 사용자에게 전송하면 사용자는 웹 브라우저를 통해 받은 페이지를 보는 것이다. 결국 서버와 사용자는 단지 요청과 응답을 주고 받는 시점에만 연결되어 있을 뿐이다.
그렇다면 서버는 로그인한 사용자가 페이지를 요청하는지 어떻게 알 수 있을까? 여기에 쿠키(cookie)와 세션(session) 기술이 개입된다.
쿠키는 최대 4KB(4096 Byte) 크기의 데이터조각이다. 쿠키를 사용하겠느냐는 서버의 요청을 허락하면 서버는 쿠키를 전송하고 사용자는, 더 자세히는 사용자의 웹 브라우저는 해당 서버에 페이지를 요청할 때 마다 쿠키를 보낸다. 예를 들어 포털 페이지에 로그인하는 경우 아래와 같이(크롬 브라우저의 경우 F12키를 눌러서 개발자 모드) 쿠키를 주고받게 된다.
쿠키는 딕셔너리 형태로 '키(key) - 값(value)'의 쌍들에 데이터들이 저장되어 있고, 데이터들의 내용은 사용자 ID, 방문 페이지 히스토리 등 각 사용자만의 고유한 정보가 포함되어 있다. 물론 보안을 위해 암호화되어 있다.
서버와 클라이언트(사용자)는 이 쿠키를 주고 받음으로써 서로가 누군지 알 수 있게 되는 것이다.
그러면 세션(session)은 또 무엇인가? 앞서 쿠키를 살펴보면서 쿠키에 데이터들이 저장되어 있다고 이야기 했었다. 즉, 암호화된 데이터들을 서버와 클라이언트가 직접 주고받는 것이다. 암호화 되어있다고는 하지만 보안 측면에서 완벽하지는 않다(물론 암호화를 푸는 것은 현실적으로 불가능하다). 더불어 작은 크기지만 서버와 클라이언트가 주고 받는 데이터의 크기가 늘어난다.
세션은 데이터의 ID만 서버와 클라이언트가 주고 받는 것이다. 그리고 데이터는 서버에 보관된다. 실제 주고 받는 데이터가 최소화되기 때문에 보안 측면에서나 주고받는 데이터 크기 측면에서 유리하다. 물론 공짜 점심이 없듯이 서버가 데이터를 관리해야 하므로 해야하는 작업이 조금 늘어난다.
포스팅을 정리해보면 아래와 같다.
서버는 쿠키와 세션을 이용해서 로그인한 사용자를 식별한다. 이 때 쿠키와 세션은 암호화된 작은 크기의 데이터를 일컫는다. 사용자는 페이지를 요청할 때 마다 쿠키 혹은 세션 데이터를 함께 보냄으로써 서버는 접속한 클라이언트가 누구인지 식별할 수 있고 사용자에게 필요한 특화된 서비스를 제공할 수 있다.
로그아웃하면 서버는 쿠키와 세션을 삭제하고 더 이상 사용하지 않는다. 이제 서버와 클라이언트는 다시 서로 모르는 사이가 된 것이다.
■
'파이썬 웹 서비스 만들기' 카테고리의 다른 글
5. 계정 관리 페이지 - 5.1. 파일 업로드 기능 (0) | 2020.10.11 |
---|---|
4. 계정 인증(로그인) 기능 - 4.2. 로그인/로그아웃 (0) | 2020.10.10 |
3. 사용자 등록 기능 - 3.3. 계정 생성 (0) | 2020.09.30 |
3. 사용자 등록 기능 - 3.2. 정보입력 페이지 (0) | 2020.09.24 |
3. 사용자 등록 기능 - 3.1. 계정 정보 정의 (0) | 2020.09.21 |
댓글