Please enable JavaScript.
Coggle requires JavaScript to display documents.
인증방식에 JWT를 사용한 이유 - Coggle Diagram
인증방식에 JWT를 사용한 이유
-
세션/쿠키 vs JWT
차이점
-
-
확장성
-
JWT : 토큰만 검증하면 됨, 분산 환경에 유리
-
-
-
Session
-
장점
즉각적인 세션 제어 가능
서버 측에서 사용자의 세션 정보를 직접 관리하므로, 특정 사용자를 강제로 로그아웃시키거나 세션을 즉시 무효화하는 것이 매우 간단
상태 정보 저장의 용이성
인증 상태 외에도 사용자의 활동 기록, 장바구니 내역 등 다양한 데이터를 세션에 저장하고 관리하기 편리
-
-
인증과정
신뢰할 수 있는 정보 전달
Header
토큰의 타입(JWT)과 서명에 사용된 해싱 알고리즘(예: HMAC SHA256, RS256) 정보를 담고 있습니다.
-
RS256
비대칭키를 이용한 디지털 서명
비대칭키 방식은 공개키와 개인키라는 한 쌍의 키를 사용하며, 개인키는 소유자만이 안전하게 보관하고 공개키는 외부에 공개할 수 있습니다.
-
-
-
-
xxxx.yyyy.zzzz 구조
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
payload
토큰에 담을 정보, 즉 클레임(Claim)을 포함합니다. 클레임은 사용자의 ID, 이름, 만료 시간 등과 같은 정보를 의미하며, name/value 쌍으로 이루어집니다. 페이로드는 Base64로 인코딩될 뿐 암호화되지 않으므로, 민감한 개인 정보는 담지 않도록 주의해야 합니다.
-
signature
헤더의 인코딩 값과 페이로드의 인코딩 값을 합친 후, 서버가 가진 비밀 키(Secret Key)로 해싱하여 생성합니다. 이 서명은 토큰의 위변조 여부를 확인하는 데 사용됩니다.
-
로그인 요청
JWT 생성 및 발급
API 요청 시 JWT 포함
서버의 JWT 검증
서버는 클라이언트로부터 받은 JWT의 서명을 비밀 키를 사용하여 검증합니다. 서명이 유효하면 토큰이 위변조되지 않았음을 신뢰하고, 페이로드에 담긴 사용자 정보를 기반으로 요청을 처리
클라이언트는 발급받은 JWT를 저장해두었다가, 서버에 API를 요청할 때마다 요청 헤더(Authorization Header)에 JWT를 담아 보냅니다.
-
서버는 사용자 인증에 성공하면, 헤더, 페이로드, 서명을 조합하여 JWT를 생성합니다. 생성된 JWT는 클라이언트에게 전달
accessToken: 유저 정보 포함, 유효기간 짧음 (ex. 15분~1시간)
refreshToken: 재발급용, 보안 고려해 httpOnly 쿠키 등에 저장
-
특징
장점
-
자가 수용적
토큰 자체에 필요한 모든 정보를 담고 있어, 별도의 인증 정보 조회가 필요 없습니다.
다양한 환경 지원
웹, 모바일 등 다양한 플랫폼과 프로그래밍 언어에서 지원
단점(한계점)
토큰 길이
세션 ID에 비해 토큰의 길이가 길어, 요청이 많아질수록 네트워크 부하가 증가할 수 있습니다.
-
토큰 탈취 시 대처의 어려움
-
대응법
Access Token
실제 API 요청에 사용되는 토큰으로, 비교적 짧은 유효기간을 가집니다.
Refresh Token
Access Token이 만료되었을 때 새로운 Access Token을 발급받기 위해 사용되는 토큰으로, Access Token보다 긴 유효기간을 가집니다.
Refresh가 탈취 당했을 때
-
탈취 탐지 메커니즘
만약 서버가 이미 만료된 Refresh Token을 사용한 요청을 감지하면, 해당 Refresh Token이 탈취되었을 가능성이 높다고 판단하고 관련된 모든 Refresh Token을 무효화하는 조치를 취할 수 있습니다.
-
Secure, HttpOnly 쿠키 사용
Refresh Token을 클라이언트의 자바스크립트에서 접근할 수 없도록 HttpOnly 속성을 설정하고, HTTPS를 통해서만 전송되도록 Secure 속성을 설정한 쿠키에 저장하여 XSS(Cross-Site Scripting) 공격으로부터 보호합니다.
-
-
-