쿠키와 세션에 이어... JWT 토큰이다. 사실 토큰이란 것이 무엇인지 모르고 그냥 핸디캔디 프로젝트를 하면서 토큰을 사용했었더랬다.
일단 다시 한 번 요약하자면,
쿠키는 브라우저가 종료되어도 유지되고 클라이언트에 정보가 저장되기 때문에 보안에 취약하다.
이를 보완하기 위해 세션이 나왔다. 세션은 정보가 서버에 저장되어 있어 상대적으로 쿠키보다는 안전하지만,
일단 세션ID도 쿠키에 저장되고(이건 토큰도 마찬가지) 서버 확장성이 매우 불편하다는 단점이 있다.
서버가 확장될 경우 로드밸런서가 세션ID를 갖고 있는 서버에 연결을 시켜주어야 한다.
이를 해결하기 위해서 세션 스토리지도 있지만, 마찬가지로 대용량 트래픽일 경우... 서버가 과부화된다.
JWT토큰은, 시크릿키를 사용하여 유저를 구분한다.
따라서 별도의 세션 스토리지가 필요 없어서 서버 과부하를 방지할 수 있다. 즉, 확장성이 매우 용이함!!
서버가 늘어나도 상관없다.
JWT 자체는 해독이 쉽기 때문에 비밀번호와 같은 민감한 정보를 담지 않는다. 또한 시크릿키는 노출되면 안되기 때문에 서버 내부에서 관리한다.
과정을 살펴보면,
1. 클라이언트 로그인
2. 서버 토큰 전송
3. 다음 데이터 접근 시 클라이언트에서 토큰을 서버에게 전달
4. 서버는 시크릿키로 사용자 정보, 토큰 만료시기, 권한 등을 파악한다. 이 때 서버도 비밀번호는 모른다!
다만 토큰도 탈취당할 수 있기 때문에 보안에 취약하다..
이를 보완하기 위해 refresh token이라는 개념이 있다.
처음 로그인을 하면 서버는 refresh, access token 두 가지를 한꺼번에 전달한다.
refresh token은 access token보다 만료기한이 더 길다.
클라이언트에서 처음에는 access token으로 요청을 보내는데, 만약 access token이 만료되었다면 브라우저에서 자동으로 access token과 refresh token을 함께 전송한다.
요약하자면, 토큰은 따로 세션 스토리지를 둘 필요가 없지만 토큰도 탈취당할 수 있다는 것이 여전히 단점이긴 하다!