🔑 시간을 사는 개발자가 되자
💡 전통적인 인증 시스템 (세션 기반)
📃 과거에는 세션 기반 인증을 주로 사용했습니다. 사용자가 로그인하면 서버에서 세션을 생성하고, 해당 세션의 ID(SID)를 쿠키에 저장해서 유지했습니다. 사용자가 다시 요청하면 서버는 쿠키에 담긴 SID를 확인해서 해당 세션 정보를 찾아 사용자를 인증했습니다
⚠️이 전통적인 인증 시스템의 문제점은 아래와 같았습니다
1️⃣ 세션 데이터가 서버에 저장됨 -> 확장성이 떨어짐(사용자가 많아질수록 서버의 부담이 증가)
2️⃣ 서버가 여러 대일 경우, 모든 서버가 세션을 공유해야 해서 관리가 복잡해집니다
⬆️ 사용자의 인증(ID/PW)이 완료되면 서버는 세션을 발급합니다. 이후 서버는 세션 값을 포함한 클라이언트의 상태를 세션 스토리지에 저장합니다. 세션 스토리지로 파일, DB, 메모리가 사용될 수 있습니다. 클라이언트는 자신의 세션 값을 클라이언트에 저장(쿠키)합니다. 서버에서는 이 세션 값을 세션 스토리지를 통해 검증한 후 데이터를 응답합니다.
💡 토큰 기반 인증 시스템 (JWT)
📃 이제는 토큰 기반 인증 방식이 많이 사용됩니다
➡️ 사용자가 로그인하면 서버는 JWT(JSON Web Token)를 생성해서 클라이언트에게 전달합니다
➡️ 이후 클라이언트는 이 JWT를 요청할 때마다 포함해서 보냅니다
➡️ 서버는 JWT를 확인해서 사용자를 인증합니다
⬆️ 사용자의 인증(ID/PW)이 완료되면 서버는 비밀키 또는 공개/개인 키를 이용해 서명한 토큰을 클라이언트에게 전달합니다. 그리고 데이터 요청 시 클라이언트는 토큰을 포함합니다. 서버는 토큰의 서명 값을 이용하여 토큰이 유호한지 검증한 후, 유효한 토큰인 경우 요청에 응답합니다.
⚡ 장점
✅ 서버에 세션 저장 필요 없음 → 확장성이 좋음 (Stateless)
✅ JWT 안에 사용자 정보가 포함됨 → 별도 데이터베이스 조회 없이 인증 가능
✅ 다양한 환경에서 사용 가능 (웹, 모바일, API 등)
💡 세션 기반 인증과 토큰 기반 인증의 차이점
‼️ 정보 포함 : 세션 값 자체에는 정보가 포함되지 않지만, 토큰 값에는 정보가 포함됩니다. 토큰에는 정보가 포함되어 있기 때문에 일반적으로 길이가 더 깁니다
‼️ 상태 정보 미저장: 세션 방식은 상태 정보를 서버 내에 저장하고 있습니다. 이에 비해 토큰은 기본적으로 서버에 클라이언트 상태를 저장하지 않는 무상태성 방식입니다. 서버에 정보를 저장할 필요가 없기 때문에 서버를 확장하는데 제약이 적습니다. 그리고 저장하지 않고 유효한 토큰인지 검증만 필요하기 때문에 다른 플랫폼, 서비스 간에 사용하기도 편리합니다
⬆️ 우리가 레스토랑에 간다고 가정해보겠습니다. 여기서 세션(Session)은 "레스토랑에서 자리를 예약하고 앉아 있는 고객"에 비유할 수 있습니다. 레스토랑에 들어가기 전, 우리는 예약을 확인 받고 자리를 지정받습니다. 세션도 사용자가 로그인하여 인증을 받으면, 그 후의 요청을 세션을 통해 인증된 상태로 처리합니다. 그리고 우리는 자리에 앉아 있는 동안, 주문을 하거나 음식을 먹는 등의 활동을 이어나갈 수 있듯이, 세션은 사용자가 웹 애플리케이션에서 작업을 진행하는 동안 그 상태(로그인된 상태 등)를 유지합니다
⬆️ 그리고 여기서 우리가 술을 시키려할때, 여기서 토큰(Token)은 "레스토랑에서는 우리가 혹시 미성년자는 아닌지 검증하는 과정"에 비유할 수 있습니다. 신분증은 개인의 나이나 신원을 증명하고, 토큰은 사용자의 권한을 검증하는 데 사용됩니다. 신분증을 보여주면 검증이 완료되듯, 토큰도 특정 시스템에 제출하면 인증이 이루어집니다.
💡 JWT(JSON Web Token) 이란?
📃 JWT는 현재 토큰 인증에서 가장 많이 사용되는 인터넷 표준입니다. 우리가 JWT, TCP, OSI와 같은 표준을 사용하는 이유는 서로 다른 시스템 간의 상호작용을 원활하게 만들기 위함입니다. 다시 돌아와 데이터들은 JSON 형태로 작성되며, 데이터를 비밀키 또는 공개/개인 키로 서명해 사용합니다. 이를 통해 JWT는 인가와 정보 교환을 위해 사용될 수 있습니다
⬆️ 헤더는 보편적으로 토큰 타입을 명시하는 "typ"와 HMAC, SHA256 등의 서명 알고리즘을 적은 "alg"로 이루어져 있습니다
⬆️ 페이로드에는 토큰에 담을 데이터가 들어있습니다. 이 데이터 하나를 JWT에서는 claim이라고 부릅니다.
⬆️ 서명 부분은 헤더와 페이로드를 서명한 값입니다. 시크릿 키를 이용해 base64 url로 인코딩한 헤더와 페이로드를 헤더에 규정된 해싱 알고리즘으로 서명합니다
📝 Reference
https://www.lgcns.com/blog/cns-tech/security/1786/
[보안동향] 인증, '토큰' 방식 새롭게 뜬다! 안전한 사용법은? - LG CNS
IT 서비스가 개인정보, 결제정보와 같이 민감한 정보를 다루기 시작하면서 보안과 프라이버시에 대한 관심이 높아졌습니다. 이로 인해 허가된 사용자에게만 정보를 제공하는 인증 절차가 필요
www.lgcns.com