티스토리 뷰

API 인증과 권한부여

  • API 서비스의 핵심은 클라이언트에게 데이터를 제공하는 데 있다. 클라이언트가 없는 API 서비스는 존재할 수 없다.

  • 집에 들어가려면 열쇠가 필요하듯이 API 서비스도 아무에게나 함부로 데이터를 제공할 수 없다. 문을 두드린 클라이언트가 들여보내도 되는지(인증 = Authentication), 들여보낸다면 데이터 범위를 어디까지 제공할 것이지(권한부여 = Authorization) 판단할 수 있는 수단이 필요하다.

OAuth 2.0

  • OAuth 2.0API를 사용하는 클라이언트에 대한 권한 부여 및 위임(Authorization)에 관한 사양(Specification)이다. OAuth 2.0의 권한 부여 및 위임 과정에서 클라이언트 사용자의 인증을 필요로 하지만 이를 어떻게 다루어야 할지는 OAuth 2.0이 다루는 범위가 아니다. [관련 링크 1] [관련 링크 2]

  • OAuth 2.0을 기반으로 사용자 인증(Authentication)을 다루는 표준이 별도로 존재한다. OpenID Connect 1.0(OIDC)이다. 관련 링크

  • 보안 측면에서 가장 견고한 사양은 OAuth 2.0이 아니라 OAuth 1.0a이다. OAuth 2.0은 결코 안전한 사양이 아니다. OAuth 2.0의 위협 모델을 다룬 RFC 6819 사양이 존재한다. 관련 링크

Spring Security

  • 흔히 웹사이트를 제작하고 운영할 때 OWASP 등을 참고하여 보안 이슈를 고려하여 인증과 권한부여 로직을 개발하게 된다. 직접 구현하기도 하고 잘 만들어진 것을 가져다 쓰기도 한다. 세상의 많은 서비스들이 같은 기능을 각자 따로 구현하는 것은 불필요한 손실이다. 이러한 고민으로 시작되어 만들어진 것이 Spring Security이다. 2003년 Java 개발자들이 중심이 되어 고민을 공유하면서 프로젝트가 시작되었고 오랜 역사 덕분에 오늘날 Java 진영에서는 가장 견고한 인증 및 권한부여 솔루션이 되었다.

  • Spring Security는 웹사이트의 모든 요청에 전처리 필터(PHP의 전처리 미들웨어와 동일)로 작동하여 미리 설정된 인증 및 권한부여 로직을 수행한다. Basic Auth, Form Auth, Remember Me 같은 오늘날 웹사이트에서 공통적으로 쓰이는 여러 인증 및 권한부여 패턴을 간결한 문법으로 제공하므로 프로젝트 보안 이슈에 직관적으로 대응할 수 있다.

OAuth 2.0과 Spring Security

  • 웹사이트가 아닌 API 서비스에 있어 인증과 권한부여는 세계적인 표준 없이 각자의 방식대로 서비스되어 왔다. 가장 전통적이고 일반적인 방식은 랜덤 생성된 고유한 api_key, api_secret을 발급 받아 매번 API를 요청할 때마다 Basic Auth 방식으로 인증 정보를 담는 것이다. 머신 대 머신 간의 API 요청 관계라면 이 방식은 간단하면서 강력하다. 하지만 서비스 복잡도가 증가하면서 이러한 간단한 인증 방식은 한계가 오기 시작했다.

  • A라는 서비스는 고객에게 사진 업로드 서비스를 제공한다. B라는 서비스는 고객에게 사진 인화 서비스를 제공한다. 고객이 A에 업로드한 사진을 B를 통해 인화하려면? BA에 업로드된 고객의 사진을 직접 가져올 수 있도록 고객에게 인증 및 권한을 요청한다. 고객이 여기에 동의하면 AAPI 서비스를 통해 B는 고객의 사진을 받아 인화 서비스를 제공할 수 있다. 이 과정에서 A 서비스를 이용하기 위한 고객의 개인정보는 B에 노출되지 않는다. 이 것을 가능하게 해주는 인증 및 권한부여 프레임워크가 바로 OAuth 2.0이다.

  • OAuth 2.0의 사용은 우리 주변에서 흔히 관찰된다. A라는 사이트(또는 모바일 앱)에서는 구글이나 페이스북 계정을 이용한 로그인 기능을 제공한다. 이 경우 해당 사이트가 구글의 OAuth 2.0 클라이언트로 등록되어 있기에 가능한 것이다.(개발자 콘솔에서 등록 가능) 우리는 구글(리소스 서버)에 계정과 정보를 소유한 사용자로서 A 사이트에 권한을 위임하여 우리의 일부 정보를 사용할 수 있게 해주는 것이다. 해당 사이트에 가입할 필요 없이 구글 계정만으로 이용이 가능해진다.

  • OAuth 2.0은 앞서 설명한 방식을 포함하여 총 4가지 인증 및 권한부여 방법을 제공한다. Spring SecuritySpring Security OAuth 모듈을 통해 OAuth 2.0 서버 기능을 제공한다.

  • 일반적인 Java 프로젝트에 Spring Boot, Spring Security, 그리고 Spring Security OAuth를 도입하면 RFC 6749를 완벽히 준수하는 OAuth 2.0 서버 기능을 수행할 수 있다. 이러한 기반 위에 각 서비스의 특성에 맞는 추가 구현이 이루어지면 개발 공수를 최소화할 수 있다.

Java 진영의 OAuth 2.0 서버 현황

  • Spring Security OAuth: Spring Security의 확장 모듈로 OAuth 2.0 서버 기능을 제공한다. RFC 6479를 기본적으로 준수하는 수준에서만 구현되어 있다. Spring Boot 기반의 빠른 프로토타이핑이 가능하지만 문서나 예제가 상당히 부실하다.

  • UAA: 클라우드 파운드리 재단에 의해 개발되고 있는 무료 오픈 소스 OAuth 2.0 서버이다. Java 8, Spring MVC 기반의 당장 운영 가능한 완성된 웹 애플리케이션이다. API 문서가 잘 만들어져 있다. 업데이트가 매우 활발하다.

OAuth 2.0 개념 잡기 추천 글

OAuth 2.0 서비스를 제공하는 벤더

댓글
댓글쓰기 폼