System Design - Authentification (Cookie, Session, Token)
Cookie
- Cookie
- 서버는 쿠키를 이용해서 브라우저에 사용자에대한 데이터를 넣을 수 있음
- Cookie 동작
- 사이트에 방문하면 브라우저는 서버에 Request 를 보냄
- Server 는 Browser 에 요청에 응답할텐데
- 해당 Response에는 모든 데이터와 사용자가 찾던 페이지 정보가 있음
- 또한 그곳에는 브라우저에 저장하고자하는 쿠키가 있을 수 있음
- From now on, 사용자가 브라우저에 쿠키를 저장한 후 해당 브라우저에 방문할 때마다 브라우저는 해당 쿠키도 요청과 함께 보내게 됨
- Cookie 특징
- Domain specific : 유투브가 준 쿠키는 유투브에만 보내지게됨
- Expiration Data : 쿠키는 서버가 정한 기간에따라 유효
- 쿠키는 인증정보뿐만이 아니라 여러가지 정보를 저장할 수 있음 (ex, 웹사이트 언어설정)
- Automatically sent
Stateless
- Stateless : 서버로 가는 모든 요청이 이전 request 와 독립적으로 다뤄짐
- Request 끼리 연결이 없음
- 메모리가 없음
- Reqeust가 끝나면 서버는 사용자에대해서 잊어버림
Session
- HTTP 는 Stateless Request / Response 동작을 하기 때문에 요청할때마다 우리가 누군지 알려줘야함
-
이를 하는 방법 중 하나가 Session
- Session 동작
- User name + Password를 서버에 보냈는데 비밀번호가 맞다면 서버는 Session DB에 해당 User record를 생성
- 해당 세션은 Unique ID를 가지고 있음 해당 세션 ID는 쿠키를 통해 브라우저로 돌아오고 저장됨
- 따라서 같은 웹사이트의 다른 페이지로 이동하면 브라우저는 세션 ID를 갖고있는 쿠키를 서버에게 보낼 것임
- 서버는 요청에 담긴 쿠키에 달린 세션 ID를 확인하고 세션 DB에서 해당 ID를 확인해봄
- 거기서 해당 ID는 특정 User것이라는 것을 알게되고 그 때 서버는 사용자를 알게됨
- 즉, 중요한 모든 정보는 Server 쪽에 있는 것
- User는 Session ID만 갖고있는 것
- Cookie 는 Session ID를 전달하기 위한 매개체
- Cookie 는 브라우저용
- 네이티브용 앱에서는 Cookie 대신 Token을 사용
- Session 특징
- 현재 로그인한 유저들의 모든 세션ID를 DB에 저장해야함
- 유저가 늘어날수록 DB도 커져야함 –> Redis (해당 목적을 수행하기 위한 빠르고 저렴한 DB)
Token
- String type
- 서버에 Token을 보냄
- 서버는 세션 DB에서 해당 토큰과 일치하는 유저를 찾게됨
JWT
DB없이 유저 인증
- Token 형식
- JWT로 유저인증을 처리하면 세션 DB를 갖출 필요가 없음
-
DB에 저장하지 않는 대신 정보에 사인하고 USer에게 다시 전달
- 이후 User가 Server에 Reqeust를 할때 해당 ‘사인된 정보Signed Info’혹은 ‘토큰’을 서버에 요청과 같이 보냄
-
페이지 요청시에 서버는 해당 토큰이 유효한지만 검증
- DB 관리 안함
- 암호화불가능 (보안성이 높은 자료는 JWT 로관리하면 안됨)