쿠키, 세션, 캐시, 그리고 토큰에 대해 알아보기 전에 우선 이것들이 왜 필요한지부터 알아보자.
📖 HTTP 프로토콜의 특징
- Connectionless(비연결지향) : 클라이언트가 서버에게 요청을 한 후 그에 맞는 응답을 받으면 그 연결을 끊는 특징이다.
HTTP는 먼저 클라이언트가 요청을 서버에 보내면, 서버는 클라이언트에게 요청에 맞는 응답을 보내고 접속을 끊는 특성이 있다. - Stateless(상태 정보 유지 X) : 연결을 끊는 순간 통신이 끝나며 상태 정보는 유지하지 않는 특징
비연결 지향의 특성 때문에 계속해서 통신 연결을 유지하지 않아 리소스 낭비가 줄어드는 장점(특히 불특정 다수를 대상으로 할 때)이 있는 동시에 통신할 때마다 새로 커넥션을 열기 때문에 클라이언트는 인증을 계속해야 하는 단점이 생긴다.
하지만 동적인 웹 애플리케이션에서는 사용자의 요청 또는 입력 정보를 유지할 필요가 있는 경우가 많다.
(예를 들어 온라인 쇼핑몰 홈페이지에서 로그인을 한 뒤 장바구니로 넘어갈 때 바로 상태가 끊어지면 아무 의미가 없어진다.)
따라서 이러한 정보를 유지할 필요가 있고 이런 걸 저장해 두고 사용할 수 있는 기능이 존재하는데 이러한 기능이 바로
쿠키, 세션, 캐시 그리고 토큰이다.
📌 쿠키
사용자의 브라우저에 저장되고, 통신할 때 HTTP 헤더에 포함되는 텍스트 데이터 파일 이름, 만료기간, 도메인, 경로 정보가 있고 키와 값으로 구성되어 있다. 쿠키 안에는 사용자의 로그인 정보 및 웹 사이트에서 어떤 행동을 했는지, 몇 번 방문했는지 등 서버에서 유저를 식별할 수 있는 데이터(패킷)가 저장되는데, 이러한 쿠키는 해당 웹 서버만 접근이 가능하다고 한다. 예를 들어 네이버에서 전송한 쿠키는 카카오 서버에서는 접근할 수 없다는 이야기이다.
쿠키의 종류
- 세션 쿠키 : 쿠키에 만료일이 포함되지 않으며, 램 메모리에만 저장되어 브라우저를 닫는 순간, 쿠키가 소멸(손실) 된다고 한다.
- 영구 쿠키 : 만료일이 포함되어 있어서 만료일까지는 브라우저를 종료하더라도 사용자의 컴퓨터에 저장되어 상태를 유지할 수 있다. 만료 시기가 되면 자동으로 삭제된다.
쿠키의 단점
해당 사용자의 컴퓨터를 사용한다면 누구나 쿠키에 입력된 값을 쉽게 확인 가능하다. 그리고 이러한 쿠키 탈취를 통해 사용자의 웹 브라우징 행동을 추적하거나 웹 계정 접근권한을 얻을 수도 있다. 또한 쿠키는 클라이언트(브라우저)에 저장되기 때문에 즉 DB를 사용하기 때문에 쿠키의 사이즈가 커질수록 클라이언트 DB에 부담이 될 수도 있다.
📌 세션
사용자가 웹 서버에 접속해 있는 상태를 하나의 단위로 인식하여 이를 세션이라고 하는데, 클라이언트가 아닌 웹 서버에 저장하는 데이터이다. 상태를 일정하게 유지시킴으로써 라운드 트립 즉 클라이언트와 서버 간의 데이터 왕복 과정을 거칠 때마다 사용자가 로그인해야 할 번거로움을 없애준다.
서버에서는 클라이언트를 구분하기 위해 유일한 값인 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우 저를 종료할 때까지 인증 상태를 유지한다. 클라이언트가 request를 보내면, 해당 서버가 클라이언트에게 세션 ID를 부여하여 클라이언트를 구별한다.
클라이언트는 이 세션 ID를 쿠키를 통해 기억한 게 된다. 이후 클라이언트가 어떤 요청을 보낼 때마다 헤더의 쿠키에 세션 ID를 담아서 전송한다.
서버는 클라이언트가 보낸 요청의 쿠키에 담긴 세션 ID와 세션 스토리지에 담긴 세션 ID를 대조해 인증 상태를 판단한다.
(즉, 세션과 쿠키는 완전히 분리된 개념이 아니며 세션은 쿠키를 기반으로 한다)
세션의 단점
서버에서 세션 저장소를 사용하므로 요청이 많아지면 서버에 부하가 심해진다. 또한 쿠키를 포함한 요청이 외부에 노출되거나 탈취되면 세션 ID 자체는 유의미한 개인정보를 담고 있지 않다고는 하지만 탈취자가 클라이언트 인척 위장할 수 있다.
📌 쿠키와 세션 비교
쿠키와 세션은 각각 클라이언트와 서버에 저장된다. 세션은 서버에 저장되므로 비교적 보안성이 좋다. 하지만 같은 이유로 서버의 처리가 요구되므로 비교적 느리다는 단점이 있다. 그에 비해 쿠키는 클라이언트에 직접 저장되어 있으므로 속도기 비교적 빠르다.
📌 서버/쿠키 기반 인증 방식
- 클라이언트가 로그인을 위해 해당 정보를 서버에 전달한다.
- 서버는 로그인 성공 시 사용자를 식별할 수 있는 고유한 세션 ID를 생성하고 이를 클라이언트에 전달한다.
- 클라이언트는 전달받은 세션 ID를 쿠키에 저장하고 이후 서버에 요청 시 쿠키를 실어서 전달한다.
- 서버는 쿠키를 받아서 세션 ID가 유효한지 확인한 이후, 그것을 키로 활용하여 클라이언트를 구분해서 클라이언트의 요청을 처리한다.
📌 토큰
최근 들어 더 안정적이고 모바일 환경에 적합한 인증 밥법으로 토큰 기반 인증이 많이 사용되고 있는 추세이다.
토큰의 정의는 소프트웨어 또는 하드웨어에서의 어떤 작업을 수행할 수 있는 권한을 나타내는 객체이다. 인증, 암호화 등 중요 작업에 많이 사용된다.
JWT
Json Web Token의 약자이다.
JSON 객체를 사용하여 가벼운 방식으로 정보를 안전성 있게 전달해주기 위한 토큰이다.
JWT의 구조
- header : JWT 인 토큰의 유형이나 HS256과 같이 사용되는 해시 알고리즘 중 무엇으로 사용했는지 등의 정보가 담긴다.
- payload : 토큰에 담을 정보, 클라이언트에 대한 정보나 메타 데이터 같은 내용이 들어있다. 여기서 주의할 점은 jwt는 그 자체 내에 이렇게 정보를 담고 있기 때문에 탈취당했을 시를 대비해 payload에 비밀번호와 같이 민감한 개인정보를 담으면 안 된다.
- signature : 헤더에서 지정한 알고리즘과 secret 키, 서명으로 payload와 header를 담는다.
JWT기반 인증 방식
- 클라이언트 로그인 요청이 들어오면, 서버는 검증 후 클라이언트의 고유한 ID 등의 정보를 payload에 담는다.
- JWT의 유효기간을 설정하고 secret키를 이용해 access token(JWT)을 발급한다.
- 클라이언트는 access token(JWT)을 받아 저장한 후 인증이 필요할 때마다 토큰을 요청 헤더 Authorization에 포함시켜 함께 전달한다.
- 서버에서는 해당 토큰의 signature를 secret 키로 복호화한 후, 위변조 여부 및 유효기간을 확인한다. 여기서 secret키가 매우 중요한 역할을 하는데 만약 JWT가 탈취당한 상황이라고 하더라도 상대방이 secret키를 모른다면 검증 단계에서 걸러지게 하는 보안적으로 큰 역할을 한다.
- 검증이 완료되고 유효한 토큰이라면, payload를 디코딩하여 사용자의 ID에 맞는 데이터를 가져온다.
📌 캐시
리소스 파일들의 임시 저장소. 같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않아도 된다.
이전에 사용되었던 데이터는 다시 사용될 가능성이 높다. 그래서 다시 사용될 확률이 있는 데이터들을 빠르게 접근 가능한 저장소에 저장한다. 즉 페이지 로딩 속도를 개선하는 좋은 방법이다.
Cache는 아래와 같은 경우에 사용을 고려하면 좋다.
- 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우(서버의 균일한 API 데이터)
- 반복적으로 동일한 결과를 돌려주는 경우(이미지나 썸네일 등)
Cache에 데이터를 미리 복사해 놓으면 계산이나 접근 시간 없이 더 빠른 속도로 데이터에 접근할 수 있다. 결국 Cache란 반복적으로 데이터를 불러오는 경우에, 지속적으로 DBMS 혹은 서버에 요청하는 것이 아니라 Memory에 데이터를 저장하였다가 불러다 쓰는 것을 의미한다.
Reference:
https://codermun-log.tistory.com/20
https://velog.io/@geunwoobaek/JWT% EB% 9E%80
https://youngjinmo.github.io/2020/03/web-session-cookie-cache/
https://mangkyu.tistory.com/69
'CS' 카테고리의 다른 글
OAuth 개념 및 동작 방식 (0) | 2021.10.27 |
---|---|
CI & CD란 (Jenkins, Gitlab CI/CD, Travis) (0) | 2021.10.19 |
API란? (SOAP API, REST API) (0) | 2021.10.11 |
HTTP와 SSL 그리고 HTTPS (0) | 2021.10.06 |
[서버/Server] APM 소스 설치(수동 설치)하기 - PHP (0) | 2021.09.12 |