스코프

스코프 (Scope)

액세스 토큰을 발급할 때 "이 토큰으로 어디까지 접근할 수 있나"를 범위로 나누고 싶을 때가 있어요. OAuth 2.0에서는 이 접근 범위를 **스코프(scope)**라는 파라미터로 표현해요. 인가 엔드포인트와 토큰 엔드포인트 모두에서 scope 요청 파라미터를 받고, 인가 서버는 발급된 토큰의 실제 범위를 scope 응답 파라미터로 알려줘요. 이 문서에서는 공식 스펙(RFC 6749 §3.3)이 스코프 값을 어떻게 정의하는지, 그리고 서버가 요청받은 범위를 어떻게 처리하는지 정리해 볼게요.

출처: RFC 6749 §3.3 — Access Token Scope

스코프 값의 문법

스코프 파라미터의 값은 공백으로 구분된, 대소문자를 구별하는(case-sensitive) 문자열 목록이에요. 각 문자열의 의미는 인가 서버가 정해요. 여러 문자열이 공백으로 나뉘어 들어와도 순서는 상관없고, 각 문자열이 요청된 접근 범위에 하나씩 추가되는 방식이에요.

스코프 값의 문법(ABNF)은 스펙에 이렇게 정의되어 있어요.

scope       = scope-token *( SP scope-token )
scope-token = 1*( %x21 / %x23-5B / %x5D-7E )

여기서 scope-token은 7-bit ASCII에서 공백(%x20), 큰따옴표(%x22), 백슬래시(%x5C), 그리고 제어 문자를 제외한 문자로만 이루어진다는 뜻이에요. 실무에서는 read, write, email, profile 같은 식으로 짧은 단어를 쓰는 경우가 흔해요.

서버가 요청 범위를 어떻게 처리하나요

클라이언트가 요청한 스코프를 인가 서버가 그대로 수용하는 건 아니에요. 스펙은 이렇게 정해요.

  • 인가 서버는 자체 정책이나 리소스 소유자의 지시에 따라, 요청된 스코프를 전체 또는 일부 무시할 수 있어요.
  • 만약 발급된 토큰의 스코프가 클라이언트가 요청한 것과 다르다면, 인가 서버는 반드시 scope 응답 파라미터로 실제로 부여된 범위를 알려줘야 해요.
  • 클라이언트가 인가 요청에서 scope 파라미터를 생략하면, 인가 서버는 미리 정의된 기본값을 사용해 처리하거나, 유효하지 않은 스코프라는 오류로 요청을 거부해야 해요.
  • 인가 서버는 자기 스코프 요구사항과 기본값(정의한 경우)을 문서화해 두는 걸 권장해요.

요청 시점에 어떻게 쓰나요

클라이언트는 인가 요청에 접근하고 싶은 범위를 담아 인가 엔드포인트로 보내요. 예를 들어 인가 코드 플로의 인가 요청에는 대략 이런 파라미터가 섞이게 돼요.

response_type=code&client_id=...&redirect_uri=...&scope=openid profile email

이렇게 요청받은 범위 중 어디까지 승인했는지가 곧 발급되는 액세스 토큰이 지닌 권한의 범위가 돼요. 따라서 스코프는 클라이언트가 "최소 권한만 요청"하도록 설계하는 원칙과도 직결되는 개념이에요.

더 알아보기 (Learn more)