🎀 쿠키 (Cookie)
클라이언트와 서버 간에 정보를 저장하고 교환하기 위한 작은 데이터 조각을 의미한다. 특히 사용자의 상태를 기록하여 저장해 두고, 클라이언트 쪽에 해당 정보를 저장한다.
사이트에 방문하면 브라우저는 서버에 요청을 보낸다.
특히 response 안에는 사용자에게 보여져야하는 모든 데이터가 들어있게된다.
이때, response 안에 쿠키🍪도 같이 포함되어있을 수 있다.
일단 한번 쿠키를 response로 받아오면 브라우저는 서버에 요청을 보낼 때 항상 쿠키를 같이 보내주게 된다.
📌 쿠키가 가진 특성
- 쿠키 저장 유효 시간을 지정할 수 있다.
- 같은 도메인끼리만 쿠키가 공유된다.
📌 쿠키 사용 예시
다크 모드 설정하기
- 사용자가 다크 모드로 설정을 변경한다.
- 서버에 다크 모드 request를 보낸다.
- 서버는 response에 다크 모드 쿠키를 담아 브라우저로 보내 "저장"한다.
- 다음번에 사용자가 다시 웹페이즈를 방문하면, 저장된 다크 모드 쿠키를 서버로 같이 요청보낸다.
- 그럼 유효 기간이 만료되기 전까지 response로 계속 쿠키 저장 정보를 받아올 수 있게 된다.
🎀 세션 (Session)
http와 https는 웹사이트 데이터 통신을 위해 사용되어지는 프로토콜이다.
이 둘은 stateless
하다고 이야기한다.
서버가 이전의 요청과 상태를 저장하고 있지 않고, 매 요청 마다 새로운 request를 보낸다는 의미이다.
즉, 서버는 사용자를 기억하고 있지 않다는 것.
그래서 우리는 요청 할 때 마다 사용자가 누군지 알려줘야한다.
이 것을 바로 "세션"이 가능하게 해준다.
📌 세션의 사용
- "밍밍이" user가 브라우저에 로그인한다.
- 해당 로그인 정보를 서버로 전송한다.
- 서버에서 Session DB라는 것을 생성하고 user 정보를 저장한다. 그리고 해당 정보에 고유한 session id를 부여해 준다.
- 해당 session id는 쿠키를 통해 브라우저로 돌아오고 저장된다.
- 같은 웹사이트의 다른 페이지로 이동하면, session id를 가지고 있는 쿠키를 서버로 전송한다.
- 서버는 session id와 해당 정보를 담은 쿠키를 저장한다.
- 저장한 session id를 가지고 session DB에 동일한 id가 있는지 확인하여 user를 특정 짓는다.
즉, 중요한 user 정보는 모두 서버에 저장되어있고 user가 가지고 있는 것은 session id 뿐이다.
📌 세션의 특징
- 로그인 된 user들의 session id를 모두 session DB에 저장해야만 한다.
- 요청이 들어올 때 마다 session DB를 뒤져서 쿠키에 담긴 session id와 일치하는 session id를 찾아 헤매야한다.
- user가 많아 질 수록 용량과 처리 속도가 느려진다.
🎀 토큰 JWT(Json Web Token)
📌 JWT의 사용
- "밍밍이" user가 브라우저에 로그인한다.
- 해당 로그인 정보를 서버로 전송한다.
- DB에 정보를 저장하거나 하지 않고, user id 정보 그 자체를 가져와서 어떤 string 형태로 변환시켜 user에게 보낸다.
- session id와 비슷하게, 서버에 요청을 보내려면 토큰을 서버로 보내야한다.
- 서버는 받아온 토큰의 정보가 유효한지를 판단한 뒤 user를 특정 짓는다.
즉, DB에 저장할 필요없이 요청이 오면 토큰이 유효한지만 판단하면 되는 것이다.
📌 JWT의 특징
- 토큰 기반 인증은 어딘가 저장한 데이터와 비교하는 게 아니라 토큰 자체 내용을 해석하기만 하면 되기 때문에 효율적이다
- REST에 부합하기 위해서는 서버가 상태 정보를 저장하지 않는,
stateless
한 특성이 있어야 한다. 서버는 클라이언트에서 보내는 정보만으로 충분히 상태를 파악할 수 있어야 하는 것이다.
이 기준에서 살펴보면 RESTful
한 API 서버를 만들고 있다면 토큰 기반 인증을 사용해야 한다.