OAuth: 개방형 인증 및 권한 부여 프로토콜
쇼핑몰 웹 사이트에 로그인 할 때
이미 사용 중인 나의 구글 계정을 이용해서
별도 회원가입 없이, 쇼핑몰 웹 사이트를 이용할 수 있다.
이 시스템을 Single-Sign-On(SSO) 라고 부른다.
하지만, SSO를 사용하면 보안상 취약한 점이 발생한다.
만약 구글 계정을 이용해 다른 애플리케이션을 이용할 때,
구글 계정 탈취의 위험성이 있다.
그래서 SSO 시스템에서 발생할 수 있는 보안상의 문제를 해결하기 위해 OAuth가 등장했다.
이전에는 다른 서비스의 계정 정보를 직접 입력해야 했는데,
OAuth는 인증을 위한 정보를 제공하고 접근 권한을 설정하여,
사용자의 비밀번호가 제3자에게 노출되는 것을 막는다.
또한 OAuth를 통해 사용자의 정보를 제공하는 과정에서도 보안에 강화되어 있다.
OAuth 방식은 사용자가 다른 애플리케이션에서 로그인할 때,
사용자의 로그인 정보(아이디와 비밀번호)를 제공하는 대신,
인증 서버에서 토큰이라는 것을 발급하여 해당 애플리케이션이나 웹사이트에 전달한다.
이 토큰을 통해 애플리케이션은 사용자의 인증을 확인할 수 있으며,
사용자의 계정 정보를 공유하지 않으므로 보안상 안전한 방식이다.
즉, OAuth는 인증 정보를 제공하는 대신 인증을 위한 토큰을 전달함으로써,
보안성을 유지하면서도 다른 애플리케이션에서 서비스를 이용할 수 있는 기술이다.
용어 정리를 해보자.
3가지가 있다.
*Grant Type: Authorization Server에서 Access Token을 받아오는 방식이다.
사이트 접속(사용자 -> 앱)
사용자가 App에 접속
인증 요청(앱 -> 인증 서버)
App에서 Authorization Server로 인증 요청을 보낸다.
인증 확인(인증 서버 -> 앱)
Authorization Server는 유효한 인증 요청인지 확인한 후 엑세스 토큰을 발급한다.
엑세스 토큰 전달(인증 서버 -> 앱)
Authorization Server에서 App으로 엑세스 토큰을 전달한다.
엑세스 토큰 전달(앱 -> 인증 서버)
App은 발급받은 엑세스 토큰을 담아 Resource Server로 사용자의 정보를 요청한다.
엑세스 토큰 확인(인증 서버)
Resource Server는 App에서 전달받은 엑세스 토큰이 유효한 토큰인지 확인한다.
사용자 정보 전달(인증 서버 -> 앱)
유효한 토큰이라면, App이 요청한 사용자의 정보를 전달한다.
Authorization Code Grant Type: Implicit에서 인증 단계를 한 단계 추가한 것.(Authorization Code를 이용해 인증을 한 단계 추가)
Refresh Token Grant Type: Refresh Token을 사용.
세션
세션은 서버측에서 저장/관리하기 때문에 상대적으로 온전한 상태 유지에 유리하다.
하지만 여전히 공격의 위험이 있다.
따라서, 유효기간, HttpOnly, Secure 옵션 등을 주어 쿠키에 저장한다.
토큰
토큰은 웹 브라우저 측(local storage, 혹은 쿠키 등)에 저장된다.
위험에 노출될 가능성이 더 큽니다.
이런 경우를 대비해 토큰에는 민감한 정보를 담지 않는다.
또한, 유효기간을 짧게 설정해 공격에 노출될 수 있는 시간을 최소화한다.
하지만 짧은 주기로 토큰이 무효화되면 서비스 사용자는 계속 로그인을 해줘야 하는 번거로움이 있다.
애초에 로그인(인증)시 refresh token이라는 것을 추가적으로 발급한다.
refresh token은 access token 보다 긴 유효기간을 가졌으며 최대한 안전한 곳에 저장된다.
기존의 토큰이 만료되거나 변질되면 refresh token을 통해 토큰을 재발급한다.
=> 따라서, 토큰 기반 인증이 세션 기반 인증에 비해 더 안전하다고 볼 수 없다.