베어러 토큰 사용

베어러 토큰 사용 (RFC 6750)

OAuth 2.0에서 가장 흔히 만나는 액세스 토큰 형태가 바로 **베어러 토큰(bearer token)**이에요. "베어러(bearer)"라는 말은 "소지자"라는 뜻으로, 토큰을 가진 사람이면 그 자격만으로 보호 리소스에 접근할 수 있다는 성질을 담고 있어요. 인가 서버가 이 토큰을 발급하면, 리소스 서버는 그 토큰을 제시하는 누구에게나 그 권한을 허용해 주는 구조예요. 그래서 사용법은 단순하지만, 그만큼 토큰 보관과 전송을 조심해야 하는 토큰이기도 해요.

출처: OAuth 2.0 Bearer Token Usage (oauth.net)

베어러 토큰은 뭘까요

베어러 토큰은 **불투명한 문자열(opaque string)**이에요. 클라이언트가 그 내용을 해석할 필요가 없도록 설계된 값이죠. 실제 모습은 서버마다 달라요. 어떤 서버는 짧은 16진수 문자열로 발급하고, 어떤 서버는 JSON Web Token(JWT) 같은 구조화된 토큰을 쓰기도 해요. 어느 쪽이든 클라이언트 관점에서는 "서버에 요청할 때 그대로 실어 보내는 값"일 뿐이에요.

HTTP로 어떻게 보내나요

베어러 토큰은 리소스 서버 요청에 어떻게 싣는지가 정해져 있어요. 표준 방식은 Authorization 요청 헤더에 Bearer 스킴을 쓰는 것이에요.

Authorization: Bearer <token>

이 외에도 폼 인코딩된 본문 파라미터나 URI 쿼리 파라미터로 전달하는 방법이 정의되어 있긴 하지만, 헤더 방식이 가장 권장돼요. URL에 토큰을 넣으면 로그나 리퍼러를 통해 토큰이 새어 나갈 수 있으니까요. 서버는 요청에 토큰이 없거나 만료됐거나 잘못됐다면 401 Unauthorized와 함께 WWW-Authenticate 헤더로 응답해요.

보안 관점의 핵심

베어러 토큰 자체가 권한을 의미하기 때문에, 이 토큰이 탈취되면 공격자도 같은 권한으로 리소스에 접근할 수 있어요. 그래서 다음과 같은 실천이 따라와요.

  • 토큰은 TLS(HTTPS) 위에서만 전송하고, 로그나 URL에 남기지 않는다.
  • 토큰 수명을 짧게 잡고, 필요할 때 리프레시 토큰으로 갱신한다.
  • 발급·폐기 수단(token revocation, RFC 7009)을 두고 토큰이 유출됐을 때 즉시 무효화할 수 있게 한다.

베어러 토큰의 이런 한계 때문에, 더 강한 보안이 필요하다면 발급 시점에 클라이언트가 비밀키 보유를 증명해야 쓸 수 있는 sender-constrained 토큰이나 DPoP 같은 확장을 고려해 볼 수 있어요.

더 알아보기 (Learn more)