쿠키와 세션은 별개의 개념이 아니다.
쿠키(Cookie)
쿠키는 클라이언트에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.
세션(Session)
세션은 일정 기간 동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술이다.
세션은 쿠키를 기반으로 동작
HTTP는 비연결성과 무상태 프로토콜이라는 특징을 가진다.
비연결성이라는 것은 클라이언트가 요청을 보내고 서버가 응답을 완료하면 연결이 끊어진다는 것이다.
Stateless(무상태) 특성은 HTTP는 따로 상태를 저장하지 않는다는 것이다. 따라서 서버는 클라이언트가 첫번째 통신 때 보낸 정보를 두번째 통신 때 알 수 없다.
하지만 애플레케이션은 로그인과 같이 상태를 유지할 필요가 있는 요구사항이 발생한다. 이와 같이 상태를 유지할 필요가 있을 때 쿠키 헤더를 사용한다. Set-Cookie 헤더를 통해 쿠키를 생성하면 이후 발생하는 모든 요청에 Set-Cookie로 추가한 값을 Cookie 헤더로 전달한다.
그러나, 쿠키는 보안상 취약하는 문제가 있다. 브라우저 개발 도구나 HTTP 분석 도구를 활용해 HTTP 요청, 응답 헤더를 눈으로 볼 수 있다. 따라서 쿠키를 통해 비밀번호나 이메일 주소와 같은 개인정보를 전달하는 것은 적합한 방법이 아니다.
이와 같은 쿠키의 단점을 보완하기 위해 세션이 등장했다. 세션은 상태 값으로 유지하고 싶은 정보를 클라이언트가 아닌 서버에 저장하는 것이다. 서버에 저장한 후 각 클라이언트마다 고유한 아이디를 발급해 이 아이디를 Set-Cookie 헤더를 통해 전달한다.
세션을 사용한다고 해서 쿠키를 사용하지 않는 것은 아니다. 세션이 상태 데이터를 웹 서버에서 관리한다는 점만 다를 뿐 HTTP에서 상태 값을 유지하기 위해 값을 전달할 때는 쿠키를 사용한다.
세션은 HTTP의 쿠키를 기반으로 동작한다는 것을 기억해야 한다.
쿠키와 세션 차이 요약
▪️ 쿠키는 클라이언트에 저장, 세션은 서버에 저장
▪️ 쿠키는 만료 시간 까지 파일로 저장되므로, 브라우저를 종료해도 정보가 남아 있다.
▪️ 세션은 브라우저가 종료되면 만료시간에 상관없이 삭제된다.
Stateless의 의미를 살펴보면 세션은 적절하지 않은 방법?
Stateless(무상태성)이란, 서버가 클라이언트의 상태를 보존하지 않는 것이다. Stateless 방식에선 클라이언트가 상태 정보를 모두 관리할 책임이 있다.
로그인 유지와 같은 상태는 stateful한 상태를 사용하여야 하는데, 서버에 부하가 생기는게 걱정될 수 있다. 그래서 stateless 특징을 유지하면서도 로그인 상태 유지를 가능하게 하는 기술이 JWT 토큰이다.
JWT(JSON Web Token)
JWT란 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 의미한다.
토큰 기반 인증 시스템
토큰 기반 인증 시스템은 클라이언트가 서버에 접속을 하면 서버에서 해당 클라이언트에게 인증되었다는 의미로 ‘토큰’을 부여한다.
이 토큰은 유일하며 토큰을 발급받은 클라이언트는 또 다시 서버에 요청을 보낼 때 요청 헤더에 토큰을 심어서 보낸다. 그러면 서버에서는 클라이언트로부터 받은 토큰을 서버에서 제공한 토큰과의 일치 여부를 체크하여 인증 과정을 처리하게 된다.
기존의 세션 기반 인증은 서버가 파일이나 데이터베이스에 세션 정보를 가지고 있어야 하고, 이를 조회하는 과정이 필요하기 때문에 많은 오버헤드가 발생한다.
하지만 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다. 토큰 자체에 데이터가 들어있기 때문에 클라이언트에서 받아 위조되었는지 판별만 하면 된다.
인증 정보에 대한 별도의 저장소가 필요하지 않고 세션과 다르게 서버는 무상태가 되어 확정이 우수해질 수 있다.
토큰 방식도 단점은 존재한다.
쿠키와 세션과 다르게 토큰은 자체 데이터 길이가 길다. 그렇기에 인증 요청이 많아질수록 네튿워크 부하가 심해질 수 있다. 또한 페이로드 자체는 암호화되지 않기 때문에 유저의 중요한 정보는 담을 수 없다. 또한, 토큰은 탈취 당하면 대처하기도 어려워진다. 그렇기에 사용 기간 제한을 설정하는 식으로 이를 해결한다.
JWT를 이용한 인증 과정
- 사용자가 ID, PW를 입력하여 서버에 로그인 인증을 요청한다.
- 서버에서 클라이언트로부터 인증 요청을 받으면 JWT를 생성하고 이를 쿠키에 담아 클라이언트에게 발급한다.
- 클라이언트는 서버로부터 받은 JWT를 로컬 스토리지에 저장한다. API를 서버에 요청할때 Authorization 헤더에 Access Token을 담아서 보낸다.
- 서버가 할 일은 클라이언트가 헤더에 담아서 보낸 JWT가 내 서버에서 발행한 토큰인지 일치 여부를 확인하는 것이다. 일치한다면 인증을 통과시켜주고 아니라면 통과시키지 않으면 된다.
- 클라이언트가 서버에 요청을 했는데, 만일 access 토큰의 시간이 만료되면 클라이언트는 리프래시 토큰을 이용해서 서버로부터 새로운 액세스 토큰을 발급 받는다.
서버는 토큰 안에 들어있는 정보가 무엇인지 아는게 중요한 것이 아니라 해당 토큰이 유효한 토큰인지 확인하는 것이 중요하다.
'Programming > Network' 카테고리의 다른 글
HTTP 버전 및 HOL Blocking에 대하여 (1) | 2024.11.25 |
---|