1. 서론
이번 글에서는 IdentityServer4(이하 IDS4)에서 AccessToken의 유효 시간 관리 방식을 분석합니다. 특히 AccessToken의 만료 시간이 지났음에도 불구하고 요청이 성공적으로 처리되는 현상에 대해 설명드리겠습니다.
2. ID Token과 AccessToken의 차이점
OpenID Connect(OIDC)는 OAuth 2.0 프로토콜을 확장한 인증 프레임워크입니다. 이는 사용자 식별 및 권한 부여를 동시에 제공하는 기능을 갖추고 있습니다. OAuth 2.0은 권한 부여 중심의 프로토콜이지만, OIDC는 이를 기반으로 사용자 인증 정보를 전달하는 역할을 수행합니다.
OIDC에서 사용되는 ID Token은 JSON Web Token(JWT) 형식을 사용하여 사용자의 인증 정보를 담고 있습니다. 이 토큰은 암호화되어 보안성과 간결성을 유지하며, UserInfo 엔드포인트를 통해 추가적인 사용자 정보를 획득할 수 있습니다.
다음은 ID Token의 예시입니다:
{
"iss": "https://server.example.com",
"sub": "24400320",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"acr": "urn:mace:incommon:iap:silver"
}
위 데이터는 IDS4에서 발급받은 AccessToken의 디코딩 결과와 유사한 구조를 가지며, 이는 JWT 형식의 특징을 반영하고 있습니다.
3. AccessToken 유효 시간 설정
IDS4에서 클라이언트 설정 시 AccessTokenLifetime 속성을 통해 토큰의 유효 기간을 조절할 수 있습니다. 단위는 초이며 기본값은 3600초(1시간)입니다.
new 인증클라이언트
{
클라이언트ID = "ro.client",
허용된_grant타입 = GrantTypes.ResourceOwnerPassword,
AccessTokenLifetime = 5,
비밀키 =
{
new Secret("secret".Sha256())
},
허용된_범위 = { "api1" }
}
위 코드는 IDS4 문서의 QuickStart 샘플을 기반으로 작성되었습니다. 주의할 점은 AccessToken의 유효 시간은 ID Token과 별도로 설정되며, API 호출 시에는 AccessToken의 유효성 검사를 수행합니다.
4. 시간 오프셋(ClockSkew) 개념
AccessToken의 유효 시간이 지났음에도 불구하고 요청이 성공적으로 처리되는 경우는 시간 오프셋 때문입니다. 이는 서버 시간차를 고려하여 토큰 유효 시간을 일정 범위 내로 연장하는 기능입니다. 기본값은 5분이며, 이는 네트워크 지연이나 시스템 시간 동기화 문제를 해결하기 위한 설계입니다.
예를 들어, AccessToken이 2018년 5월 6일 16:50:55에 만료되면, 실제 검증 시 16:55:55까지 유효하다는 의미입니다.
5. 시간 오프셋 설정 방법
JWT 검증 시 시간 오프셋 값을 수정할 수 있습니다. 이는 API 리소스에서 직접 설정해야 하며, 다음은 설정 예시입니다:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvcCore()
.AddAuthorization()
.AddJsonFormatters();
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.JwtValidationClockSkew = TimeSpan.FromSeconds(0);
options.ApiName = "api1";
});
}
위 설정을 통해 시간 오프셋을 0초로 변경하면, AccessToken의 유효 시간이 정확하게 적용됩니다.
6. 결론
생산 환경에서는 시스템 시간 동기화를 철저히 관리해야 하며, 시간 오프셋 값을 변경할 때는 주의가 필요합니다. 이 설정은 네트워크 지연과 시스템 시간 차이를 보완하기 위한 설계로, 일반적인 상황에서는 변경하지 않는 것이 좋습니다.