쿠키하면 가장 먼저 생각나는 것은 동그랗게 생긴 과자다. 칙촉, 오레오 같은 과자들이 가장 먼저 떠오른다.
하지만 웹, 컴퓨터 분야에서 쓰이는 쿠키는 작은 크기의 데이터(최대 크기 4KB) 조각을 의미한다. 많고 많은 이름 중에 도대체 왜??? 쿠키라고 이름붙여진 것일까? 궁금한 것은 못참는 필자는 인터넷을 돌아다니며 그 유래를 찾아보았다.
거의 일치된 의견은 UNIX 운영체제에 쓰이는 'Magic cookie'에서 유래했다고 보고 있다(Magic cookie도 프로그램 사이에 주고 받는 작은 크기의 데이터다). 그럼 Magic cookie는 왜 cookie라는 단어를 쓰게 되었을까?
용어를 처음 만든 사람들이 어떤 생각을 가졌었는지 사실 알 길은 없다. 그래도 들어볼 만한 프로그래머들의 의견 중 하나는 동화 '헨젤과 그레텔(Hensel and Gretel)'에서 유래했다는 것이다. 동화 '헨젤과 그레텔'을 보면 헨젤과 그레텔 남매가 숲에서 길을 잃지 않기 위해 빵 부스러기를 땅에 흘려놓는데 새들이 먹어치워 길을 잃게 된다. 그러다 과자로 만든 집에 이르게 된다. 만약 빵 부스러기가 아니라 과자를 떨어뜨려 놓았다면 어땠을까? 새들이 그 많은 과자들을 다 먹을 수 있었을까?
과자를 떨어뜨려 놓았다면 길을 잃지 않았을 것이다. 그래서 UNIX 개발자들은 과자cookie를 이용하기로 했다. Magic cookie라고 이름붙인 데이터 조각에 파일의 읽은 위치를 기록해서 주고 받았다. 이렇게 매직 쿠키Magic cookie를 이용해서 어디까지 작업을 진행했는지 서로 다른 프로그램들이 알 수 있다. 믿거나 말거나지만 쿠키cookie의 기능과 그 유래를 잘 설명한다.
서버-클라이언트 모델에서 웹 서버와 사용자(client)의 소통은 기본적으로 사용자가 정보를 요청하고 웹 서버가 정보를 전달하는 방식이다. 이 관계에서 웹 서버는 어떤 사용자가 어떤 정보를 요청하고 있는지 그 상황을 기억하지 않는다. 그래서 웹에서의 소통은 기본적으로 '상태를 기억하지 않는다 = stateless'라고 표현한다.
하지만 우리가 웹 브라우저를 이용해서 인터넷 쇼핑몰, SNS 등을 이용하면 접속한 사용자가 누구인지 웹 서버가 알고 서비스를 제공한다. 예를 들어 한 번 로그인하면 로그아웃 하기 전 까지 로그인한 상태가 유지된다. 이는 우리 눈에는 보이지 않지만 기본적으로 웹 브라우저가 웹 서버와 쿠키를 주고 받기 때문에 가능한 일이다.
웹 브라우저는 사용자가 웹 서버에 데이터(예, 페이지)를 요청할 때 마다 쿠키를 함께 전달한다. 이 쿠키를 보고 웹 서버는 누가 데이터를 요청하는지 알 수 있게된다. 웹 서버를 만드는 웹 프로그래밍 관점에서 상대방(예, 웹 브라우저)이 보내온 쿠키를 적절하게 관리하는 것이 필요하다.
파이썬 플라스크에서는 response 객체를 이용해서 쿠키를 설정하고,
from flask import make_response
resp = make_response("setting up a cookie")
resp.set_cookie("userId", "A123")
request 패키지를 이용해서 사용자가 보내온 쿠키를 읽을 수 있다.
from flask import request
userId = request.cookies.get("userId")
쿠키를 설정해서 사용자에게 보내고, 사용자가 보내온 쿠키를 읽는 전체 과정을 웹 서비스로 만들어보면 아래와 같다.
아래와 같이 예제를 위한 프로젝트 01_cookie_session을 생성하였다. 그리고 프로젝트 디렉토리 바로 아래 웹 서비스 메인 앱이되는 appmain 패키지를 위한 디렉토리 appmain과 초기화 파일 __init__.py를 생성하였다(이어지는 session 예제 진행을 위해 session 디렉토리도 함께 생성하였다).
다시 cookie 디렉토리 아래에 초기화 파일 __init__py와 로직 파일 routes.py를 아래와 같이 생성하였다(cookie 디렉토리는 __init__.py 파일이 존재하기 때문에 파이썬 번역기 관점에서 파이썬 패키지가 되었다).
쿠키 처리와 관련된 기능을 수행할 cookie 패키지는 아래와 같이 3개의 메서드를 갖도록 하였다.
- 쿠키 생성 - setCookie
- 쿠키 확인 - getCookie
- 쿠키 삭제 - deleteCookie
쿠키는 삭제할 때도 있는데 가장 빈번하게 사용되는 경우가 사용자가 로그아웃하면 더 이상 쿠키가 필요없기 때문에 삭제하게 된다. 위 세 메서드를 아해와 같이 routes.py 파일 안에 구현하였다.
▶ appmain/cookie/routes.py
from flask import make_response, Blueprint, request
#### 쿠키 처리와 관련된 기능을 cookie라는 이름의 Blueprint 객체로 분리하였다.
cookie = Blueprint('cookie', __name__)
@cookie.route("/set_cookie")
def setCookie():
#### HTTP 응답(response)객체를 생성한다.
resp = make_response("setting up a cookie")
#### HTTP 응답(response)객체에 쿠키를 설정한다.
resp.set_cookie("userId", "12345")
return resp
@cookie.route("/get_cookie")
def getCookie():
#### 쿠키의 내용 중 userId 항목을 읽는다.
userId = request.cookies.get("userId")
return 'user ID is ' + userId
@cookie.route("/delete_cookie")
def deleteCookie():
resp = make_response("deleting the cookie")
#### 쿠키의 수명을 0으로 설정하면 쿠키는 소멸된다.
resp.set_cookie("userId", "", expires = 0)
return resp
쿠키처리 관련해서 특별히 초기화해주어야 할 내용은 없다. 따라서 __init__.py 파일은 비워놓는다. 사실 cookie라는 Blueprint 객체를 __init__.py 파일에서 생성해주어도 좋다. 하지만 관련된 내용은 (코드를 나중에 다시 보는 경우를 위해) 최대한 모아 놓는 것을 선호해서 로직 파일 안에 함께 기술하였다.
▶ appmain/cookie/__init__.py
이제 메인 패키지(appmain) 초기화 파일을 작성하자. 메인 패키지 초기화 파일에서는 플라스크 객체를 생성하고 cookie 처리를 담당하는 cookie 패키지를 이 플라스크 객체에 등록한다.
▶ appmain/__init__.py
from flask import Flask
#### 플라스크 객체를 생성한다. 객체의 이름은 프로세스의 이름(__name__)을 따른다.
app = Flask(__name__)
from appmain.cookie.routes import cookie
#### 쿠키cookie 패키지를 플라스크 객체에 등록한다.
app.register_blueprint(cookie)
마지막으로 프로젝트 실행 파일을 run.py를 작성하였다. run.py 파일은 메인 패키지에서 생성되고 설정된 플라스크 객체 app을 받아서(from appmain import app) 이를 설정한 IP와 포트 번호에서 응답을 주고 받도록 실행시킨다.
▶ run.py
from appmain import app
if __name__ == "__main__":
app.run("127.0.0.1", 5000)
예제의 구조를 정리해 보면 아래와 같다.
cookie 패키지: cookie 처리 관련 기능 구현 → appmain 패키지: 플라스크 웹 서버를 생성하고 cookie 패키지를 웹 서버에 포함 → run.py: 플라스크 웹 서버를 실행시킴
run.py 파일을 실행시켜 프로젝트를 실행시키고 웹 브라우저를 통해 아래 URL에 차례대로 접근해본다.
① 127.0.0.1:5000/set_cookie
웹 서버는 쿠키를 생성해서 사용자에게 보낸다. 사용자는 웹 브라우저를 통해 쿠키가 생성되었다는 것과 생성된 쿠키의 내용을 확인할 수 있다.
② 127.0.0.1:5000/set_cookie
서버는 쿠키의 내용을 가져와서 그 내용을 사용자에게 보여준다. 사용자는 웹 브라우저를 통해 쿠키의 내용을 확인할 수 있다.
③ 127.0.0.1:5000/delete_cookie
웹 서버는 쿠키의 수명을 0으로 설정하여 쿠키를 삭제할 수 있다. 삭제된 쿠키는 웹 브라우저의 디버깅모드(크롬의 경우 F12)를 통해 확인해 볼 수 있다.
■
'웹 프로그래밍 고급 주제들' 카테고리의 다른 글
3. AJAX와 플라스크 (0) | 2020.12.16 |
---|---|
2. 데이터베이스와 세션 연결 - 2.2. 코드 리뷰 (0) | 2020.12.16 |
2. 데이터베이스와 세션 연결 - 2.1. 기본 개념 (0) | 2020.12.12 |
1. 쿠키와 세션 - 1.2. Why? 세션? (0) | 2020.12.08 |
Advanced? 고급? 제목에 관해서 (0) | 2020.12.03 |
댓글