세션 방식 vs JWT 방식: 인증 시스템의 이해
현대의 웹 애플리케이션에서는 사용자 인증을 위해 세션 방식과 JWT(JSON Web Token) 방식을 주로 사용합니다. 두 방식은 각기 다른 장단점을 가지고 있으며, 애플리케이션의 요구 사항에 따라 선택해야 합니다. 이번 포스트에서는 각 방식의 차이점, JWT의 단점 및 이를 보완하는 방법 중 하나인 "Refresh Token Rotation"에 대해 알아보겠습니다.
1. 세션 방식(Session-Based Authentication)
세션 방식은 서버에 사용자 정보를 저장하고 이를 바탕으로 인증을 유지하는 전통적인 방식입니다. 사용자가 로그인할 때 서버는 고유한 세션 ID를 생성하여 클라이언트에게 전달하고, 서버에 해당 세션 ID와 사용자 정보를 저장합니다. 이후 클라이언트가 요청할 때마다 세션 ID를 함께 보내어 인증을 수행합니다.
- 장점:
- 보안성: 세션 ID가 서버에만 저장되므로, 토큰 유출에 대한 위험이 상대적으로 적습니다.
- 세션 관리: 서버에서 세션을 만료시키거나 삭제할 수 있어 세션 관리가 용이합니다.
- 단점:
- 서버 부하: 모든 세션 정보가 서버에 저장되므로, 유저가 많아질수록 서버에 부하가 증가하게 됩니다.
- 확장성 부족: 클러스터 환경이나 분산 시스템에서는 각 서버에 세션을 공유해야 하므로 관리가 복잡해집니다.
2. JWT 방식(JSON Web Token-Based Authentication)
JWT 방식은 세션 없이 토큰을 사용하여 인증을 유지하는 방식입니다. 로그인 시점에 서버는 사용자 정보를 포함한 JWT를 생성하여 클라이언트에 전달하고, 이후 요청 시 클라이언트는 이 토큰을 함께 보내어 인증을 수행합니다. JWT는 클라이언트 측에서만 관리되므로 서버에 별도 저장소가 필요하지 않습니다.
- 장점:
- 확장성: 서버에 인증 정보를 저장하지 않으므로 클라우드 환경에서 확장성이 뛰어납니다.
- 유연성: 분산 서버나 마이크로서비스 환경에서 통합 인증 체계를 구축하기에 유리합니다.
- 단점:
- 토큰 유출 위험: 토큰이 유출될 경우 토큰 만료 시간 동안 공격자가 이를 사용할 수 있는 위험이 있습니다.
- 토큰 갱신 문제: JWT는 만료 시간을 설정할 수 있지만, 만료 후 자동으로 재발급되는 기능이 기본적으로 없습니다.
- 크기 문제: JWT는 자체적으로 사용자 정보를 포함하므로, 세션 방식보다 데이터 크기가 클 수 있습니다.
3. 인용한 글
인용한 글 =>
문제인식
Access Token을 적용하고 아주 큰? 문제를 발견했다.
보안 상으로 Access Token은 매우 짧은 만료기간을 가지고 있다. 그래서 사용자는 매번 만료가될 시 로그인을 새로 하여, 새롭게 Access Token을 받아야 한다는 것이다.
또한
사용자의 자동로그인에 문제가 생겼다.
해결방법
여러가지의 해결방법이 있다.
- Access Token의 만료기간을 매우매우 길게 설정해준다.
- -> 보안 상 불가능
- Access Token을 매번 요청마다 새롭게 갱신한다.
- -> 서버에 너무나 많은 요청을 하게 된다.
- Refresh Token을 도입한다.
- 사실상 가장 괜찮은 기법
그럼 Refresh Token에 대해서 알아보자.
Refresh Token
간단하게, Access Token을 재발급 받기위한 Token이다.
OAuth2.0을 이용하여 타서비스 로그인 기능을 구현한 경험이 있다면, 누구나 들어보았을 것이다.
flow는 다음과 같이 움직인다.
- 클라이언트에서 로그인한다.
- 서버는 클라이언트에게 Access Token과 Refresh Token을 발급한다. 동시에 Refresh Token은 서버에 저장된다.
- 클라이언트는 local 저장소에 두 Token을 저장한다.
- 매 요청마다 Access Token을 헤더에 담아서 요청한다.
- 이 때, Access Token이 만료가 되면 서버는 만료되었다는 Response를 하게 된다.
- 클라이언트는 해당 Response를 받으면 Refresh Token을 보낸다.
- 서버는 Refresh Token 유효성 체크를 하게 되고, 새로운 Access Token을 발급한다.
- 클라이언트는 새롭게 받은 Access Token을 기존의 Access Token에 덮어쓰게 된다.
- 7번 과정에서 Refresh Token도 갱신하는 경우가 있다. 이건 선택 사항 같다.
4. JWT 방식의 단점 보완: Refresh Token Rotation
JWT의 단점 중 하나는 만료된 토큰을 갱신하는 것이 어렵다는 점입니다. 이를 보완하기 위해 Refresh Token을 함께 사용하는 방식이 일반적입니다. Refresh Token Rotation은 Refresh Token을 주기적으로 갱신하여 보안성을 강화하는 방식입니다.
Refresh Token Rotation의 작동 방식
- Access Token과 Refresh Token을 함께 발급합니다.
- Access Token이 만료될 경우, Refresh Token을 이용하여 새로운 Access Token과 Refresh Token을 발급받습니다.
- 새로운 Refresh Token을 발급받으면 이전 Refresh Token은 사용 불가능하게 됩니다. 이를 통해 Refresh Token이 탈취되더라도 안전성을 유지할 수 있습니다.
장점
- 보안성 향상: Refresh Token이 주기적으로 갱신되므로 토큰 탈취 시 공격자가 오래 사용하지 못하게 됩니다.
- 자동 로그아웃 기능: Refresh Token을 이용한 재발급 요청이 없으면 사용자 세션을 종료하여 보안을 강화할 수 있습니다.
Refresh Token Rotation 적용 시 고려 사항
- Refresh Token 저장 위치: Refresh Token은 상대적으로 긴 만료 시간을 가지므로, 이를 안전한 장소 (예: 쿠키, Secure/HttpOnly 속성을 설정한 스토리지)에 저장해야 합니다.
- 로그아웃 처리: 사용자가 로그아웃할 경우, 서버에서 해당 Refresh Token을 폐기 처리하여 재발급을 막아야 합니다.
결론
세션 방식과 JWT 방식은 각기 다른 장점과 단점을 가지고 있으며, 애플리케이션의 요구 사항에 따라 적합한 인증 방식을 선택해야 합니다. 특히 JWT 방식의 단점인 토큰 유출 위험 및 갱신 문제는 Refresh Token Rotation을 통해 보완할 수 있습니다. 이를 통해 높은 보안성을 유지하면서도 서버 부하를 줄이고 확장성 있는 인증 체계를 구축할 수 있습니다.
마지막으로 인증 방식 선택 시 애플리케이션의 규모와 보안 요구 사항을 충분히 고려하여, 최적의 방식을 선택하는 것이 중요합니다.
'보안' 카테고리의 다른 글
http와 https의 차이점 (0) | 2024.09.10 |
---|---|
와이파이 보안 프로토콜 (0) | 2024.08.11 |