HTTP 통신은 요청(Request) -> 응답(Response) 이 종료되면 stateless(상태가 유지되지 않은) 한 특징 때문에 연결을 끊는 처리 방식입니다.
로그인과 같은 일을 할 때, '누가' 로그인 중인지 상태를 기억하기 위해 쿠키, 세션, 토큰을 사용합니다.
set-cookie
에 담는다. cookie
에 담아 보낸다. 예를들어 사용자의 로그인 상태를 유지하는 기능을 위해 쿠키에 아이디와 비밀번호를 담아두고 있습니다. 이렇게 된다면 개인 소유가 아닌 컴퓨터에서 사용할 경우 사용자의 개인정보가 털릴것이고, http로 개인정보를 주고 받다보면 쿠키가 유출, 조작이 될 수 있는 보안상 큰 문제를 야기시킵니다.
session은 비밀번호와 같은 인증 정보를 쿠키에 저장하지 않고 대신에 사용자의 식별자인 session id
를 저장합니다. 서버에는 인증 정보와 더불어 이 ID에 해당하는 사용자의 정보를 저장합니다.
세션은 서버에 저장하기 때문에 사용자가 수백, 수천, 수만으로 늘어난다면 해당 유저의 정보를 찾고 데이터 매칭에 오랜 시간이 걸리면서 서버에 부하가 가해지게 됩니다.
Authentication : 인증. 내가 누구인지 증명 ! 해주는 것.
Authorization : 인가. 음.. 너구나 ! ok 통과다
단순 웹 토큰(SWT) 및 SAML(Security Assertion Markup Language) 토큰과 비교할 때 JWT 를 사용하면 이점이 있습니다. 쿠키와과 세션을 동시에 사용하는 인증 방식이라고도 이해하고있습니다
1. More Compact : JSON으로 인코딩 하기 때문에, XML로 인코딩하는 SAML 토큰보다 작습니다.
2. More Secure : JWT는 공개키와 개인키를 나누어 서명이 가능합니다. HMAC 암호 알고리즘을 사용하여 암호화된 서정도 가능합니다.
3. More Common : JSON의 object는 일반적인 프로그래밍 언어이기때문에 접근성이 좋습니다.
4. Easier to process : JWT는 인터넷 규모로 사용됩니다. 모바일에서 처리하는 것이 더 쉽다는 것을 의미합니다.
토큰은 헤더(Header),페이로드(payload),서명(signature) 세 파트를 . 으로 구분하는 구조입니다.
JWT를 검증하는데 필요한 정보를 가진 JSON 객체는 Base64 URL-Safe 인코딩된 문자열입니다. 헤더는 jwt를 어떻게 검증(verify)하는가에 대한 내용을 담고 있습니다. alg는 서명시 사용하는 알고리즘이고, kid는 서명시 사용하는 키(pubilc/private key)를 식별하는 값입니다.
JWT의 내용입니다. 페이로드에 있는 속성들을 클레임 셋(Claim Set)이라고 부릅니다. 클레임 셋은 jwt에 대한 내용(토큰 생성자의 정보, 생성일시,,,)이나 클라이언트와 서버 간 주고받기로 한 데이터들로 구성됩니다.
점(.)을 구분자로 해서 헤더와 페이로드를 합진 문자열을 서명한 값입니다. 서명은 헤더의 alg에 정의된 알고리즘과 비밀 키를 이용해 생성하고 Base64 URL-Safe로 인코딩 합니다.
토큰의 만료 시간이 짧으면 탈취되더라도 금방 만료되기 때문에 피해를 최소화 할 수 있습니다. 하지만 사용자가 자주 로그인 해야하는 불편함이 있습니다.
예를들어 로그인하고 글을 작성하는 도중 토큰이 만료 된다면 저장 작업이 정상적으로 작동하지않고 작성한 글이 날아가는 일이 생기는 등 불편함이 존재합니다. Sliding Session은 서비스를 지속적으로 이용하는 클라이언트에게 자동으로 토큰 만료 기한을 늘려주는 방법입니다. 1번의 자주 로그인해야하는 단점을 보완시켜줍니다.
클라이언트가 로그인 요청을 보내면 서버는 Access Token과 그보다 만료기간이 긴 Refresh Token을 함께 내려줍니다. 클라이언트는 Access Token이 만료되었을 때, Refresh Token을 사용하여 Acess Token의 재발급을 요청합니다. 서버는 DB에 저장된 Refresh Token과 비교하여 유요한 경우 새로운 Access Token을 발급하고, 만료된 경우 다시 로그인 시킵니다.
검증을 위해서는 서버에 Refresh Token을 별도로 저장시켜야합니다.
📄 도움받은글