쿠키
클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어 있는 데이터 파일이다.
- 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증이 유지가 되는 특징이 있다.
- 쿠키는 사용자가 요청하지 않아도 브라우저가 Request 시 Request Header를 넣어서 자동으로 서버에 전송한다.
쿠키의 동작 방식
- 클라이언트가 페이지를 요청 (사용자가 웹사이트에 접근)
- 웹 서버에서 쿠키를 생성
- 생성한 쿠키를 HTTP 헤더에 포함 시켜 클라이언트에게 응답
- 클라이언트가 쿠키를 가지고 있다가 다시 서버에 요청할 때 쿠키를 함께 전송
- 동일한 웹사이트 재방문 시 클라이언트 PC에 해당 쿠키가 있는 경우, 요청 페이지와 함께 쿠키를 전송
쿠키의 종류
1. 세션 쿠키
사용자가 사이트를 탐색할 때 선호 사항, 임시 설정 등을 저장하는 쿠키
만료일을 설정하지 않기 때문에 브라우저를 종료하 사라진다.
2. 지속 쿠키
디스크에 저장되어서 만료일까지는 브라우저를 끄거나 재부팅하여도 남아있는다.
다음 방문에도 영향을 주는 설정 정보나 로그인 정보 등을 유지할 때 사용하는 쿠키
차이점
세션쿠키와 지속쿠키는 파기시점 외에 차이점이 없다. Discard라는 파라미터가 설정되어 있거나, 파기까지 남은시간인 Expires또는 Max-Age라는 파라미터가 없으면 세션쿠키이다.
캐시
웹 페이지 요소를 저장하기 위한 임시 저장소이며, 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다.
- 사용자가 같은 웹 사이트를 재 방문할 경우, 저장된 캐시 데이터를 이용하여 페이지 로딩 속도를 개선할 수 있다.
- 반복적으로 사용하는 콘텐츠를 빠르게 이용할 수 있고 데이터 사용량도 줄일 수 있다.
쿠키와 캐시의 차이
쿠키와 캐시 모두 정보를 저장하여 재활용하는 기술이지만, 쿠키는 사용자의 수고를 덜어주는 데 목적을 두고 캐시는 데이터의 전송량을 줄이고 서비스 이용 속도를 높이는 데 목적이 있다.
세션
쿠키를 기반으로 동작하지만, 사용자 정보를 클라이언트 측이 아닌 서버측에서 관리한다.
- 웹사이트의 동시 접속자 수가 많은 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 된다.
- 클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 Session ID를 부여한다.
세션의 동작 방식
- 클라이언트가 페이지를 요청 (사용자가 웹사이트에 접근)
- 서버는 클라이언트의 세션 ID 를 확인
- 세션 ID 존재하지 않을 경우, 세션 ID를 생성하여 클라이언트에게 응답
- 세션 ID를 쿠키를 사용해 서버에 저장
- 클라이언트 재접속 시, 쿠키를 이용하여 세션 ID 값을 서버에 전달
쿠키와 세션의 차이
세션은 쿠키를 사용하기때문에, 비슷한 역활을 하며 동작원리도 비슷하지만 가장 큰 차이점은 사용자의 정보가 저장되는 위치 이다.
- 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다.
- 쿠키는 클라이언트 로컬에 저장되기 때문에 request에서 스니핑의 위험, 변질 등 보안에 취약하지만 세션은 쿠키를 이용해 세션 ID 만 저장하고 서버에서 처리하기 때문에 비교적 보안성이 좋다.
- 세션은 정보가 서버에 저장되어 있기 때문에 서버 처리가 필요하므로 쿠키에 비해 비교적 느린 속도이다.
JWT
JWT(JSON Web Token) 는 인증에 필요한 정보들을 암호화시킨 토큰이다.
JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별한다.
JWT의 구조는 위 사진과 같이 세가지 문자열의 조합이며, 빨간글씨가 Header, 보라색글씨가 Payload, 파란글씨가 Signature 이다. 실제 디코딩된 JWT는 Header
, Payload
, Signature
로 이루어져 있다.
- header: alg와 typ라는 정보가 존재하는데 alg 의 값은 정보를 암호화할 해싱 알고리즘, typ의 값은 토큰의 유형이다.
{
"alg": "HS256",
"typ": JWT
}
- payload: 여기에 담은 정보의 한 조각을 클레임이라고 한다. 토큰의 목적에 따라 클레임이 달라진다. 주로 클라이언트ID, 유효 기간 등이 포함된다.
- signature: 인코딩된 Header, Payload 를 더한 비밀키이다. 토큰의 위변조 여부를 확인하는데 사용한다.
JWT 동작 방식
- 클라이언트가 페이지를 요청 (사용자가 웹사이트에 접근)
- 서버에서 JWT 토큰 생성 후 클라이언트로 전달
- 클라이언트는 서버 측에서 전달받은 토큰을 쿠키나 스토리지에 저장
- 서버에 요청할 때마다 해당 토큰을 HTTP 헤더에 포함시켜 전달
- 서버는 전달받은 토큰의 Signature 를 비밀키로 복호화하고, 위변조, 유효 기간 등 검증하고 요청에 응답
세션과 JWT 의 차이
세션방식은 서버가 로그인된 유저의 정보를 모두 저장하고 있어 서버의 부하가 갈 수 있지만, 유저의 통제가 JWT 보다 쉽다.
JWT 의 경우 서버가 토큰을 발급 후 JWT 를 관리하지 않는다.(탈취를 당했을 때 토큰의 회수나 사용정지는 힘들다. 유효기간을 짧게 하거나, 훔치기 어렵게 하는 등의 방법이 있다.) JWT가 유효한 것인지만 확인하기 때문에 서버의 부하가 세션방식보다 낮다.