Spring Security OAuth 2.0, POST /oauth/check_token 요청 분석

기능

  • POST /oauth/check_token 요청은 클라이언트가 요청한 access_token 파라메터가 유효한지 확인하고 access_token이 참조하는 상세 정보를 응답한다.

실행조건

  • 클라이언트는 POST /oauth/token 요청으로 access_token 값을 발급 받은 상태이어야 한다.

요청사양

curl -X POST \
'http://localhost:8080/oauth/check_token' \
-d 'token=a1849c64-2ca6-4d32-8f15-6cf01029dfb6'

실행순서

1: CharacterEncodingFilter.doFilter()
2: HiddenHttpMethodFilter.doFilter()
3: HttpPutFormContentFilter.doFilter()
4: RequestContextFilter.doFilter()
5: WebAsyncManagerIntegrationFilter.doFilter()
6: SecurityContextPersistenceFilter().doFilter()
7: HeaderWriterFilter.doFilter()
8: CsrfFilter.doFilter()
9: LogoutFilter.doFilter()
10: UsernamePasswordAuthenticationFilter.doFilter()
11: DefaultLoginPageGeneratingFilter.doFilter()
12: BasicAuthenticationFilter.doFilter()
13: RequestCacheAwareRequestFilter.doFilter()
14: SecurityContextHolderAwareRequestFilter.doFilter()
15: AnonymousAuthenticationFilter.doFilter()
16: SessionManagementFilter.doFilter()
17: ExceptionTranslationFilter.doFilter()
18: FilterSecurityInterceptor.doFilter()
19: CheckTokenEndpoint.checkToken()
  • access_token의 확인은 서비스 레이어의 DefaultTokenServicereadAccessToken(accessToken) 호출 및 DAO 레이어의 InMemoryTokenStore(ConcurrentHashMap)의 readAccessToken(tokenValue) 호출로 획득한다.

  • 토큰 저장소의 access_token이 가진 정보는 기본적으로 아래와 같다.
{
    "value": "a1849c64-2ca6-4d32-8f15-6cf01029dfb6",
    "expiration": "Tue Jul 18 02:50:59 KST 2017",
    "tokenType": "bearer",
    "refreshToken": "9c2d4115-ebd2-4ff5-8f69-1c2e1198cf52",
    "scope": [
        "read:users"
    ]
    "additionalInformation": []
}
  • access_token이 존재하지 않으면 InvalidTokenException 예외를 발생시킨다.

  • access_token이 만료되었으면 InvalidTokenException 예외를 발생시킨다.

  • access_token이 참조하는 username이 유효하지 않을 경우 InvalidTokenException 예외를 발생시킨다.

  • access_token이 참조하는 client_id가 유효하지 않을 경우 InvalidTokenException 예외를 발생시킨다.

응답사양

### 성공 응답
200 OK
{
    "exp": 1500313858,
    "user_name": "user",
    "authorities": [
        "ROLE_USER"
    ],
    "client_id": "some_client_id",
    "scope": [
        "read:users"
    ]
}

### token 파라메터가 존재하지 않을 경우
400 Bad Request
{
    "timestamp": 1500275505030,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.bind.MissingServletRequestParameterException",
    "message": "Required String parameter 'token' is not present",
    "path": "/oauth/check_token"
}

### token 파라메터가 유효하지 않을 경우
400 Bad Request
{
    "error": "invalid_token",
    "error_description": "Token was not recognised"
}

### token 파라메터 만료되었을 경우
400 Bad Request
{
    "error": "invalid_token",
    "error_description": "Token has expired"
}
저작자 표시 비영리 동일 조건 변경 허락
신고