쿠키는 웹사이트 접속 시 브라우저에 저장되는 기록 정보 파일이다.
쿠키는 여러 요청이 동일한 브라우저에서 온 요청인지 서버가 식별하기 위해 사용된다.
Stateless 한 HTTP의 특성을 보완하기 위해 사용된다고 할 수 있겠다.
이를 통해 서버 및 웹사이트들은 쿠키를 보낸 해당 브라우저들에 필요한 정보를 더 신속하게 제공해줄 수 있다.
쿠키는 이름, 값, 만료 기간, 경로 및 도메인 등으로 이루어져 있다. 크롬에서 확인할 수 있다.
동작 원리는 다음과 같다.
세션은 클라이언트 식별 정보를 담고 있는 웹서버의 임시 저장소이다.
세션도 쿠키와 동일하게 클라이언트를 식별하기 위해 사용된다.
하지만 쿠키와 다르게 서버에 저장되기 때문에 보안상 더 안전하다.
세션은 세션 ID, 세션 데이터, 세션 만료 시간, 세션 유지 방법 등으로 구성되어 있다.
세션 ID는 클라이언트를 식별하기 위한 고유한 식별자이다.
세션 데이터는 서버가 유지하는 사용자 정보이다. 로그인 정보, 좋아요 한 게시물 목록 등이 해당한다.
마찬가지로 브라우저에서 확인할 수 있다.
동작 원리는 다음과 같다.
세션은 로그인 상태 유지 등을 구현하는 데 사용된다.
로그인한 후 새로고침하거나 다른 페이지로 이동해도 로그인이 유지된 이유는 클라이언트가 열심히 세션 ID를 담은 쿠키를 보내고 있었기 때문이었다.
JWT는 JSON Web Token의 약자로서, JSON 형태의 데이터를 사용한 토큰 기반 인증 방식이다.
JWT는 쿠키와 세션 인증 방식에서 발생할 수 있는 단점들을 극복한 인증 방식을 갖고 등장하였다.
JWT는 Header, Payload, Signature의 구조를 가지고 있고 각 구성요소는 점으로 구분되어 있다.
Header에는 토큰의 유형과 해싱 알고리즘이 명시되어 있다.
Payload에는 토큰에 포함될 정보가 저장되어 있다. 사용자 ID, 사용자 이름, JWT 발급 시간 등이 포함됨.
Signature에는 토큰의 유효성 검사를 위한 데이터이다. 이는 Header와 Payload를 합쳐 비밀키를 사용하여 해싱한 값이다.
jwt.io 라는 사이트에서 직관적으로 확인해볼 수 있다.
// 비밀 키를 넣어 HS256 알고리즘으로 Signature 생성.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
{Base64Url encoded header}.{Base64Url encoded payload}.{Base64Url encoded signature}
서버가 토큰을 발급할 때 두 가지 토큰을 함께 발급하여 클라이언트로 제공해줄 수 있다.
Access Token은 사용자 인증에 성공했을 때 발급되며 서버에 요청시 인증 정보로 사용되는 토큰이다. 반면 Refresh Token은 Access Token의 만료 시점이 도래했을 때 새 Access Token을 발급받기 위한 용도로 사용된다.
주로 Access Token은 만료 기간을 짧게 설정하여 만료시 Refresh Token으로 재발급 받아 인증 정보를 유지하는 방식을 사용한다. 만약 Access Token이 탈취되더라도 Refresh Token으로 재발급하여 사용할 수 있기 떄문이다. 재발급되면 기존의 Access Token은 무효해진다.
쿠키는 비교적 구현이 간단하고 모든 브라우저에서 지원되어 범용성이 높다.
하지만 브라우저에 저장되어 보안에 취약하고 저장할 수 있는 용량이 제한되며 도메인 단위로만 제한을 둘 수 있다는 단점이 있다.
세션은 세션 정보가 서버에 저장되기 때문에 쿠키보다 보안에 강하고 용량이 더 커 많은 정보를 저장할 수 있다. 그러나 서버에 세션 정보를 저장하기 때문에 서버의 자원을 더 많이 소모하고 서버 확장시 세션을 활용할 추가 방안이 요구된다.
JWT는 암호화된 데이터를 통해 유효성을 검사하기 때문에 쿠키, 세션보다 더 보안에 유리하다. 또한 서버에서 사용자의 정보를 저장하지 않기 때문에 서버의 자원을 절약할 수 있다.
하지만 JWT는 탈취되었을 때 제 3자가 악용할 수 있기 때문에 이를 보완할 추가 방안이 필요하다.
쿠키, 세션, JWT를 학습하며 클라이언트의 정보를 저장하고 인증하는 방식들이 각자 어떤 구조로 어떻게 작동하는지 알 수 있었다.
모든 기술이 그렇듯 이 친구들도 필요한 상황에 맞추어 사용해야 함을 알 수 있었다.
쿠키는 좋아요 기능을 구현할 때 사용해보았는데 저런 방식으로 동작하는 줄은 모르고 있었다.
더 깊은 내용은 기술을 직접 사용할 때 알아보도록 하자.
그리고, 썸네일의 저 짤은 잘못된 것이었다. 쿠키는 브라우저가 구운 게 아니었다..