인트로스펙션(Introspection)은 OAuth 2.0에서 사용되는 토큰 검증 방식 중 하나로, 불투명 토큰(opaque token)의 상태 및 세부 정보를 확인하기 위해 리소스 서버가 권한 서버(Authorization Server)에 요청을 보내는 과정을 의미합니다.
불투명 토큰(Opaque Token)은 토큰 자체에 사용자 정보나 권한 등의 데이터를 담지 않고, 단순한 무작위 문자열로 이루어진 토큰입니다. 토큰 자체는 해석할 수 없기 때문에 "불투명"하다고 불립니다.
이러한 불투명 토큰의 유효성을 확인하려면 리소스 서버가 권한 서버(Authorization Server)에 요청을 보내어 검증해야 합니다. 이를 토큰 인트로스펙션(Token Introspection)이라고 합니다.
불투명 토큰의 특징
- 토큰 자체에 정보 없음
- 불투명 토큰은 단순한 키값(랜덤 문자열)일 뿐, 유저 정보나 만료 시간 같은 데이터는 포함되지 않습니다.
- 정보는 권한 서버에만 저장됩니다.
- 서버 측 검증 필요
- 리소스 서버가 토큰의 유효성을 확인하기 위해 권한 서버에 검증 요청을 해야 합니다.
- 토큰 인트로스펙션 엔드포인트를 사용합니다.
- 실시간 토큰 무효화 가능
- 토큰 검증이 권한 서버에 의존하기 때문에 즉시 토큰을 무효화할 수 있습니다.
- 이는 JWT와 같은 투명 토큰과의 중요한 차이점입니다.
불투명 토큰의 구조
불투명 토큰은 다음과 같은 형태를 가집니다.
ey7d8w9d83nd9f0c1a... (임의의 문자열)
이 토큰을 받은 리소스 서버는 토큰 자체를 해석하지 않고 권한 서버에 문의해야 합니다.
불투명 토큰의 검증 과정 (토큰 인트로스펙션)
- 클라이언트가 권한 서버로부터 불투명 토큰을 발급받습니다.
- 클라이언트는 리소스 서버에 요청할 때 이 불투명 토큰을 함께 전송합니다.
Authorization: Bearer <TOKEN>
- 리소스 서버는 이 토큰의 유효성을 확인하기 위해 권한 서버의 인트로스펙션 엔드포인트에 검증 요청을 보냅니다.
- 요청 예시:
curl -X POST http://auth-server:8080/oauth2/introspect \ -u "client_id:client_secret" \ -d "token=<ACCESS_TOKEN>"
- 요청 예시:
- 권한 서버는 토큰을 검증한 후 리소스 서버에 결과를 반환합니다.
- 예시 응답:
{ "active": true, "scope": "read write", "client_id": "client", "username": "taehun", "exp": 1700000000, "sub": "user123" }
- 예시 응답:
- 리소스 서버는 검증된 정보를 바탕으로 요청을 처리합니다.
불투명 토큰과 JWT의 차이점
특징 | 불투명 토큰(Opaque Token) | JWT (JSON Web Token) |
---|---|---|
토큰 구조 | 임의의 문자열 | 사용자 정보, 만료 시간 등이 포함된 JSON |
검증 방식 | 권한 서버에 검증 요청 필요 | 로컬에서 서명 검증 가능 |
유효성 확인 | 권한 서버와 통신이 필요 | 권한 서버와 통신 없이 검증 가능 |
실시간 무효화 | 즉시 토큰 무효화 가능 | 권한 서버에서 별도 블랙리스트 관리 필요 |
보안성 | 토큰 자체에 정보가 없어 노출 위험이 적음 | 토큰에 정보 포함 → 노출 시 위험 |
성능 | 네트워크 비용 발생(권한 서버 요청) | 성능 우수(로컬 검증) |
불투명 토큰의 장점
- 보안 강화
- 토큰에 사용자 정보를 담지 않으므로 노출되어도 안전합니다.
- 실시간 토큰 무효화
- 권한 서버에서 토큰을 무효화하면 바로 적용됩니다.
- 중앙화된 관리
- 모든 토큰 검증을 권한 서버에서 수행하므로 관리가 일관적입니다.
불투명 토큰의 단점
- 성능 오버헤드
- 리소스 서버가 권한 서버와 통신해야 하므로 네트워크 비용과 응답 지연이 발생할 수 있습니다.
- 권한 서버 의존성
- 권한 서버가 중단되면 토큰 검증이 불가능해집니다.
불투명 토큰이 사용되는 경우
- 실시간 토큰 무효화가 필요한 경우
- 권한 서버에서 토큰을 즉시 비활성화해야 하는 시스템.
- 보안 강화가 필요한 시스템
- 토큰에 정보가 노출되지 않아야 하는 경우.
- 간단한 토큰 구조를 선호하는 시스템
- 서버 측에서만 정보를 저장하고 관리합니다.
정리:
불투명 토큰은 정보를 담지 않은 임의 문자열로, 리소스 서버는 토큰의 유효성을 검증하기 위해 권한 서버와 통신해야 합니다. 이를 통해 보안이 강화되고 토큰 무효화가 즉시 가능하지만, 성능과 네트워크 비용 측면에서 다소 비효율적일 수 있습니다.
인트로스펙션이 필요한 이유
- 불투명 토큰은 토큰 자체에 사용자 정보나 만료 시간 등의 클레임을 담지 않기 때문에, 리소스 서버는 토큰만으로는 그 유효성을 판단할 수 없습니다.
- 따라서 리소스 서버는 권한 서버의 인트로스펙션 엔드포인트에 요청을 보내 토큰의 상태와 정보를 확인합니다.
인트로스펙션의 동작 흐름
- 클라이언트가 권한 서버로부터 Access Token을 발급받습니다.
- 클라이언트가 리소스 서버에 요청을 보낼 때 Access Token을 포함시킵니다.
Authorization: Bearer <ACCESS_TOKEN>
- 리소스 서버는 권한 서버의 인트로스펙션 엔드포인트에 HTTP 요청을 보냅니다.
- 엔드포인트 예시:
/oauth2/introspect
- 엔드포인트 예시:
- 권한 서버는 해당 토큰의 상태(유효성, 만료 여부 등)를 확인한 후 결과를 리소스 서버에 반환합니다.
- 리소스 서버는 반환된 정보를 바탕으로 요청을 처리하거나 거부합니다.
인트로스펙션 요청 예시
리소스 서버가 권한 서버에 POST 요청을 통해 토큰 검증을 진행합니다.
요청 (cURL)
curl -X POST http://auth-server:8080/oauth2/introspect \
-u "client_id:client_secret" \
-d "token=<ACCESS_TOKEN>"
-u
: Basic Auth 방식으로 클라이언트 ID와 클라이언트 Secret을 전송합니다.token
: 검증하려는 Access Token입니다.
인트로스펙션 응답 예시
권한 서버가 검증 후 리소스 서버에 반환하는 JSON 형식의 응답 예시입니다:
{
"active": true,
"scope": "read write",
"client_id": "client",
"username": "taehun",
"exp": 1700000000,
"iat": 1699990000,
"nbf": 1699990000,
"sub": "user123",
"aud": "resource_server",
"iss": "http://auth-server:8080",
"jti": "b6a7c23e-4f15-4a1b-b3ea-d1234567a89b"
}
응답 필드 설명
active
:- 토큰이 유효하면
true
, 그렇지 않으면false
.
- 토큰이 유효하면
scope
:- 토큰에 부여된 권한 범위(예:
read
,write
).
- 토큰에 부여된 권한 범위(예:
client_id
:- 이 토큰을 발급받은 클라이언트의 ID.
username
:- 토큰과 연관된 사용자의 이름.
exp
:- 토큰의 만료 시간(Unix 시간).
sub
:- 토큰 소유자의 고유 ID.
aud
:- 이 토큰의 대상 리소스 서버.
iss
:- 토큰을 발급한 권한 서버.
인트로스펙션의 장점
- 중앙화된 토큰 검증
- 토큰 검증을 권한 서버에 위임하기 때문에 관리가 일관적이고 안전합니다.
- 실시간 토큰 무효화
- 권한 서버에서 토큰을 만료시키거나 무효화하면 리소스 서버가 이를 바로 반영합니다.
- 보안 강화
- 토큰에 민감한 정보를 직접 담지 않으므로 토큰 노출 위험이 줄어듭니다.
인트로스펙션의 단점
- 성능 저하
- 매 요청마다 권한 서버와 통신해야 하기 때문에 네트워크 오버헤드가 발생합니다.
- 의존성 증가
- 권한 서버가 중단되면 리소스 서버도 영향을 받을 수 있습니다.
토큰 인트로스펙션과 JWT의 차이점
구분 | 불투명 토큰 (Opaque Token) | JWT |
---|---|---|
검증 방식 | 인트로스펙션 엔드포인트를 호출 | 자체 서명 검증 (로컬 검증) |
토큰 내용 | 정보가 담겨 있지 않음 | 클레임 정보 포함 |
성능 | 네트워크 요청으로 상대적으로 느림 | 로컬 검증이므로 빠름 |
무효화(리얼타임) | 즉시 무효화 가능 | 무효화 시 별도 처리가 필요 |
토큰 크기 | 상대적으로 작음 | 상대적으로 큼 |
정리
토큰 인트로스펙션은 리소스 서버가 불투명 토큰의 유효성과 세부 정보를 확인하기 위해 권한 서버의 인트로스펙션 엔드포인트에 요청을 보내는 프로세스입니다.
이 방식은 보안성이 뛰어나지만, 성능에 있어 다소 비효율적일 수 있습니다.
JWT와 같은 투명 토큰이 자체 검증이 가능한 것과는 차이가 있으며, 실시간 토큰 무효화가 필요한 경우 인트로스펙션이 유용합니다.
'Springboot > Springboot Security' 카테고리의 다른 글
Jason Web Token (0) | 2024.12.24 |
---|---|
OAuth2.0 (1) | 2024.12.19 |
OpenID Connect (OIDC) (1) | 2024.12.18 |
UserDetails, UserDetailService (0) | 2024.12.17 |
JWT (JSON Web Token) (0) | 2024.11.01 |