JWT와 세션
jwt가 무엇인가요?
- JWT는 JSON Web Token의 약자로, 웹에서 사용되는 토큰 기반의 인증 방식 중 하나입니다.
- JWT는 토큰 자체가 모든 정보를 가지고 있기 때문에 서버의 세션 저장소에 정보를 저장할 필요가 없으며, 사용자 정보를 인코딩하여 토큰에 저장하므로 클라이언트와 서버 간의 통신이 더욱 간편해집니다.
jwt는 어떻게 이루어져있나요?
- JWT는 3개의 파트로 이루어져 있습니다.
- 첫 번째 파트는 Header, 두 번째 파트는 Payload, 세 번째 파트는 Signature 입니다.
- 각 파트는 Base64Url로 인코딩되어 있으며, 각각 "."으로 구분되어 있습니다.
각 파트에 대해서 간단하게 설명해주세요.
- Header: JWT 토큰의 타입과 알고리즘 정보를 포함하는 JSON 객체입니다. 보통 JWT를 인코딩할 때 Base64Url로 인코딩되어 헤더 파트에 추가됩니다.
- Payload: JWT에 포함될 정보를 담고 있는 JSON 객체입니다. 클라이언트가 서버로 전달하려는 정보, 사용자 식별자, 권한 등이 포함될 수 있습니다. 마찬가지로 Base64Url로 인코딩되어 페이로드 파트에 추가됩니다.
- Signature: JWT를 인증하기 위한 서명 정보입니다. 서명을 생성하기 위해서는 Header와 Payload, 그리고 사전에 정해진 비밀키가 필요합니다. 보통 Header와 Payload를 합쳐서 하나의 문자열로 만든 후, 비밀키를 이용하여 서명합니다. 서명은 Base64Url로 인코딩되어 토큰 뒷부분에 추가됩니다.
jwt와 세션 중 왜 jwt를 사용하셨나요?
- 서버의 자원을 사용하는 횟수가 세션에 비해 현저히 적고, 트래픽이 많아져 다중 서버로 늘렸을 때 문제 없이 사용할 수 있게 하기 위해서 입니다.
세션이 왜 jwt에 비해 서버의 자원을 사용하는 횟수가 많나요?
- 세션은 인증이나 인가를 하는 과정에서 서버 자원에 접근을 합니다. 이유는 사용자의 데이터가 담긴 데이터는 서버 측에서 관리를 하기 때문입니다.
- 반면, jwt는 사용자의 정보가 토큰의 payload에 저장되어 있기 때문에 서버 자원에 접근하지 않더라도 인증이나 인가를 할 수 있다.
그렇다면 jwt는 서버 자원을 전혀 쓰지 않는다는 건가요?
- 아닙니다. jwt는 보통 access token과 refresh token으로 이중으로 나누어 사용합니다. refresh token은 비교적으로 수명이 짧은 access token을 재발급 시켜주기 위해 존재하는데, 이것은 서버가 관리합니다. 로그아웃을 해서 해당 refresh token을 무효화 시키기 위해 혹은 access token이 만료가 되어서 갱신을 하기 위해 서버 자원을 사용합니다. 하지만 매 인증이나 인가 요청마다 서버 자원을 사용하는 session보다는 적습니다.
그렇다면 session보다 jwt가 훨씬 좋은거네요?
- 그렇지도 않습니다. 토큰을 클라이언트가 가지고 있어서 탈취를 당하게 되었을 경우 access token을 무효화 시킬 수 있는 방법이 따로 없습니다. 그렇기 때문에 토큰이 노출될 경우, 보안에 취약해 질 수 있습니다.
보안 관련해서 해결 방안이 있을까요?
- access token의 만료 시간을 짧게 설정한다거나, 만료된 토큰을 서버에 저장하여 검증하는 방법이 있습니다.
- HTTPS를 사용하여 통신을 암호화해야 합니다.
다중 서버가 되었을 때 jwt가 왜 세션에 비해 문제 없이 사용할 수 있나요?
- 클라이언트 측에서 토큰을 가지고 있기 때문입니다. 반면 세션은 서버 측에서 세션 데이터를 관리하기 때문에 세션 데이터를 동기화 하기 위한 별도의 처리가 필요합니다.
jwt는 클라이언트 측에서 어디에 저장이 되나요?
- 일반적으로 웹 애플리케이션에서는 브라우저의 로컬 스토리지나 세션 스토리지, 쿠키 등에 저장됩니다. 모바일 애플리케이션에서는 로컬 스토리지나 앱 내 데이터베이스에 저장됩니다.
쿠키와 세션의 장단점에 대해서 설명해주세요.
- 쿠키는 클라이언트 측에서 처리되며 브라우저 캐시에 저장되어서 빠른 데이터 전송 속도를 제공합니다. 하지만 브라우저 설정에 따라 쿠키를 거부할 수 잇으므로 사용자의 동의가 필요하고, 보안상에 문제가 있습니ㅏㄷ.
- 세션은 서버에 저장되므로 보안성이 높고, 용량 제한이 없어서 대용량 데이터를 저장하기에 적합합니다. 하지만 서버 부하가 증가할 수 잇으며 쿠키에 비해 느린 속도를 보입니다.