Spring 기반 OAuth2 인증 시스템을 운영 중 다음과 같은 인증 관련 오류를 경험하였습니다. 해당 사례를 정리하여 공유드립니다.
문제 상황
애플리케이션 로그에서 다음과 같은 두 가지 유형의 에러가 반복적으로 발생하였습니다.
- Connection reset 에러 (POST /check_token 요청 실패)
java.net.SocketException: Connection reset org.springframework.web.client.ResourceAccessException: I/O error on POST request - Access Token 만료 에러
authorization error : 400 : { "code": "...", "message": "invalid_token", "details": "Token has expired" }
환경 요약
- Spring Boot 기반 OAuth2 Resource Server
- 외부 인증 서버를 통한
/check_token방식의 Access Token 검증 사용 - 프론트엔드: 브라우저 기반 SPA
원인 분석
1. 토큰 만료 및 갱신 실패
브라우저에 저장된 Access Token이 만료되었음에도 불구하고, 자동 갱신이 정상적으로 이루어지지 않은 상태에서 계속 요청이 발생함에 따라 만료된 토큰으로 인증 요청이 이루어졌습니다. 이로 인해 인증 서버는 400 invalid_token 응답을 반환하였고, 일부 요청은 연결 자체가 끊어지는 Connection reset 오류로 이어졌습니다.
2. 리프레시 토큰 처리 미작동
SPA에서 Access Token이 만료될 경우 일반적으로 Refresh Token을 통해 새 토큰을 발급받아야 하지만, 다음과 같은 상황에서는 갱신이 되지 않을 수 있습니다.
- 사용자가 브라우저를 장시간 열어두었을 경우
- 네트워크 오류나 일시적인 세션 단절
- 리프레시 로직이 특정 조건에서 호출되지 않음
해결 방법
1. 프론트엔드 리프레시 로직 점검
- Access Token 만료 전에 갱신 요청을 수행하는 로직을 점검하였습니다.
- 토큰 갱신 실패 시 fallback으로 로그아웃 또는 강제 재인증을 유도하는 방식 도입.
2. 백엔드 예외 처리 강화
/check_token호출 시 예외 발생(Connection reset)에 대비한 재시도 또는 명확한 실패 응답 반환 구조 마련.- 로그 기록 개선으로 원인 추적성을 확보.
3. 토큰 정책 재설계 검토
- 짧은 Access Token 유효 시간을 사용하는 경우에는 리프레시 자동화 로직의 신뢰성을 높이는 것이 중요합니다.
- JWT 방식 도입 또는 introspection 방식 재설계 검토 중.
고객 대응 방식
토큰 만료로 인한 오류는 고객 측에서도 충분히 발생할 수 있는 상황이므로, 다음과 같이 안내드렸습니다.
"브라우저에 저장된 인증 토큰이 만료되었지만, 자동 갱신이 이루어지지 않아 인증 오류가 발생한 것으로 확인됩니다. 브라우저를 새로고침하거나 로그아웃 후 다시 로그인하시면 정상적으로 이용하실 수 있습니다."
마무리
Access Token 만료는 OAuth2 기반 시스템에서 빈번히 발생할 수 있는 이슈입니다. 특히 SPA 환경에서는 자동 갱신 로직의 실패가 인증 실패로 이어지므로, 클라이언트-서버 간의 토큰 수명 정책, 갱신 메커니즘, 예외 대응 체계를 종합적으로 고려해야 합니다.
반응형
'개발 (Development) > Java' 카테고리의 다른 글
| [Java/SpringBoot] 서버 간 API 호출 오류: Connection reset 에러 분석 및 해결 방법 (0) | 2025.07.13 |
|---|---|
| [Java] LinkedHashMap에서 특정 값을 가진 항목 제거하는 방법 (0) | 2025.07.05 |
| [Java/SpringBoot] Spring에서 예외를 던지지 않고 API 응답은 유지하며 로그는 ERROR로 남기지 않도록 처리하는 방법 (0) | 2025.06.28 |
| [Java] printStackTrace() 경고 해결 및 로깅 적용하기 (0) | 2025.06.28 |
| [Java/Spring Boot] AWS 환경에서 DB 직접 접근이 어려운 경우: Java 애플리케이션에서 SQL 파일을 실행하여 데이터 삽입하기 (2) | 2025.05.18 |