HTTP는 인터넷 상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜 입니다.
클라이언트가 서버에게 요청을 보내면 서버는 응답을 보냄으로써, 데이터를 교환합니다.
HTTP는 비연결성 및 무상태성 이라는 특징을 가지고 있습니다.
따라서, 클라이언트에 대한 이전의 상태 정보 및 현재 통신의 상태가 남아있지 않습니다.
서버가 다수의 클라이언트와 연결을 계속 유지한다면, 이에 따른 자원낭비가 심해집니다.
비 연결성및 무상태성의 특징을 가진다면 불필요한 리소스 낭비를 줄일 수 있다는 장점이 있습니다.
그러나 서버는 클라이언트를 인식할 수 없다는 단점 또한 존재합니다.
로그인을 하더라도 다음 요청에서는 해당 클라이언트를 기억하지 못해, 또 로그인을 해야 하는 문제가 발생합니다.
하지만 우리가 사용하고 있는 웹 사이트들의 경우, 한번 로그인 하면 다시 로그인 할 필요 없이 여러 페이지를 보고, 다양한 기능을 이용할 수 있습니다.
이는 HTTP의 비연결성 및 무결성의 특징을 보완한 기술인
Cookie와 Session 덕분입니다.
쿠키란 클라이언트가 어떠한 웹사이트를 방문할 경우, 그 사이트가 사용하고 있는 서버를 통해 클라이언트의 브라우저에 설치되는 작은 기록 정보 파일을 의미합니다.
Set-Cookie
에 담습니다.Cookie
에 담아 보냅니다.쿠키를 통해 클라이언트 로그인 상태를 유지시킬 수 있지만, 가장 큰 단점은
쿠키가 유출 및 조작 당할 위험이 존재한다는 점 입니다.
개인정보를 HTTP로 주고 받는 것은 위험합니다.
세션은 비밀번호 등 클라이언트의 인증 정보를 쿠키가 아닌 서버측에 저장하고 관리합니다.
HTTP/1.1 200
Set-Cookie: JSESSIONID=FDB5E30BF20045E8A9AAFC788383680C;
JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미합니다.
JWT기반 인증은 쿠키/세션 방식과 유사하게 JWT토큰을 HTTP헤더에 실어 서버가 클라이언트를 식별합니다.
JWT 는.
를 구분자로 나누어지는 3가지 문자열의 조합입니다.
실제 코딩된 JWT는 다음과 같은 구조를 가집니다.
Header 의 alg와 typ은 각각 정보를 암호화할 해싱 알고리즘 및 토큰의 타입을 지칭합니다.
Payload는 토큰에 담을 정보를 가지고 있습니다.
주로 클라이언트의 고유 ID값 및 유효기간 등이 포함되는 영역입니다.
Key-Value형식으로 이루어진 한 쌍의 정보를 Claim 이라 지칭합니다.
Signature는 인코딩된 Header와 Payload를 더한 뒤 비밀키로 해싱하여 생성합니다.
Header 와 Payload는 단순히 인코딩 된 값이기 때문에 제 3자가 복호화 및 조작할 수 있지만, Signature는 서버측에서 관리하는 비밀키가 유출되지 않는 이상 복호화할 수 없습니다.
따라서 Signature 는 토큰의 위변조 여부를 확인하는데 사용됩니다.
Authorization
에 포함시켜 함께 전달합니다.JWT 사용시 상기한 단점들을 극복하기 위해 다양한 전략을 채택할 수 있습니다.
각각의 전략은 장단점이 상이하기 때문에, 서비스의 특성을 고려하여 보안 수준을 높일지 사용자의 편의성을 높일지 결정해야 합니다.
토큰의 만료 시간을 짧게 설정하는 방법을 고려할 수 있습니다.
토큰이 탈취되더라도 빠르게 만료되기 때문에 피해를 최소화할 수 있습니다.
그러나 사용자가 자주 로그인해야하는 불편함이 수반됩니다.
글을 작성하는 도중 토큰이 만료가 된다면 Form Submit 요청을 보낼 때 작업이 정상적으로 처리되지 않고, 이전에 작성한 글이 날아가는 등의 불편함이 존재합니다.
Sliding Session은 서비스를 지속적으로 이용하는 클라이언트에게 자동으로 토큰 만료 기한을 늘려주는 방법입니다.
글 작성 혹은 결제 등을 시작할때 새로운 토큰을 발급해줄 수 있습니다.
이를 통해 사용자는 로그인을 자주 할 필요가 없어집니다.
클라이언트가 로그인 요청을 보내면 서버는 Access Token및 그보다 긴 만료 기간을 가진 Refresh Token을 발급하는 전략입니다.
클라이언트는 Access Token이 만료되었을 때 Refresh Token을 사용하여
Access Token의 재발급을 요청합니다.
서버는 DB에 저장된 Refresh Token과 비교하여 유효한 경우 새로운 Access Token을 발급하고, 만료된 경우 사용자에게 로그인을 요구합니다.
해당 전략을 사용하면 Access Token의 만료 기한을 짧게 설정할 수 있으며, 사용자가 자주 로그인할 필요가 없습니다.
또한 서버가 강제로 Refresh Token을 만료시킬 수 있습니다.
그러나 검증을 위해 서버는 Refresh Token을 별도의 storage에 저장해야합니다.
이는 추가적인 I/O작업이 발생함을 의미하기 때문에 JWT 의 장점(I/O작업이 필요 없는 빠른 인증처리)을 완벽하게 누릴 수 없습니다.
클라이언트도 탈취 방지를 위해 Refresh Token을 보안이 유지되는 공간에 저장해야 합니다.
출처 : https://tecoble.techcourse.co.kr/post/2021-05-22-cookie-session-jwt/