[Java/SpringBoot] Spring OAuth2 시스템에서 발생한 Access Token 만료 및 인증 오류 대응 기록

2025. 6. 28. 19:25·개발 (Development)/Java

Spring 기반 OAuth2 인증 시스템을 운영 중 다음과 같은 인증 관련 오류를 경험하였습니다. 해당 사례를 정리하여 공유드립니다.

문제 상황

애플리케이션 로그에서 다음과 같은 두 가지 유형의 에러가 반복적으로 발생하였습니다.

  1. Connection reset 에러 (POST /check_token 요청 실패)
    java.net.SocketException: Connection reset org.springframework.web.client.ResourceAccessException: I/O error on POST request
  2. 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
'개발 (Development)/Java' 카테고리의 다른 글
  • [Java/SpringBoot] 서버 간 API 호출 오류: Connection reset 에러 분석 및 해결 방법
  • [Java] LinkedHashMap에서 특정 값을 가진 항목 제거하는 방법
  • [Java/SpringBoot] Spring에서 예외를 던지지 않고 API 응답은 유지하며 로그는 ERROR로 남기지 않도록 처리하는 방법
  • [Java] printStackTrace() 경고 해결 및 로깅 적용하기
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (235) N
      • 개발 (Development) (168) N
        • Algorithm (1)
        • Angular (1)
        • AWS (7)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (34)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (33) N
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (12)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    timescaledb
    데이터분석
    백준자바
    오답노트
    Vue.js
    docker
    Linux
    JPA
    ADsP
    백준알고리즘
    리눅스 마스터 2급 2차
    JSON
    javascript
    DevOps
    MyBatis
    springboot
    Kafka
    PostgreSQL
    백준
    pandas
    자바
    리눅스 마스터 2급
    Kubernetes
    Linux master
    백준온라인저지
    AWS
    java
    deepseek
    python
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Java/SpringBoot] Spring OAuth2 시스템에서 발생한 Access Token 만료 및 인증 오류 대응 기록
상단으로

티스토리툴바