로그인 프로세스를 공부하다 보면 OAuth 2.0과 OpenID Connect(OIDC)라는 용어를 자주 접하게 된다. 많은 사람 혹은 나 또한 SNS 로그인 방식이라고만 생각하는 경우가 많았는데, 사실 이 두 표준은 인터넷에서 Authentication과 Authorization을 담당하는 매우 중요한 역할을 하고 있다.
이번 포스팅은 OAuth 2.0과 OIDC에 대해 작성하기 전에 두 표준을 이해하기 위해 반드시 알아야 하는 핵심 키워드와 개념을 명확히 정리하고 작성하였다.
1) OAuth 2.0
1. 개념
OAuth 2.0은 한 서비스가 다른 서비스의 데이터에 접근할 수 있도록 권한을 부여하는 보안 표준이다.
사용자 이름과 비밀번호를 직접 공유하는 대신 특정 권한을 부여하는 키를 제공하는 방식으로 동작한다.
- OAuth 2.0은 인증 (Autentication)을 위한 프로토콜이 아니라 인가 (Authorization) 즉, 권한 부여에 중점을 둔다.
OAuth 2.0은 프레임워크로 불리며 구현에 유연성이 있지만, 이로 인해 다양한 구현 방식이 존재한다.
2. 주요 역할
2.1. 리소스 소유자 (Resource Owner)
이메일, 사진, 프로필 정보 등 자신의 데이터에 대한 접근 권한을 관리하는 사용자 자신을 의미하고 있으며, 제 3자 어플리케이션이 자원에 접근하는 것을 허용하거나 거부할 수 있다.
- 예시) 구글 계정의 데이터에 대한 소유자
2.2. 클라이언트 (Client)
리소스 소유자의 동의를 얻어 리소스 서버의 자원을 사용하거나 신원을 확인하려는 역할을 하는 어플리케이션을 의미하고 있다.
- 예시) 구글 계정으로 로그인을 운영하는 서비스가 클라이언트가 된다.
클라이언트의 유형
- 기밀 클라이언트 (Confidential Clients)
- Client Secret을 안전하게 저장할 수 있는 클라이언트
- 예시) 보안 서버에서 실행되는 웹 어플리케이션
- 공개 클라이언트 (Public Clients)
- Client Secret을 안전하게 유지할 수 없는 클라이언트
- 예시) 브라우저 기반 어플리케이션, 모바일 앱, IoT 장치 등
2.3. 인가 서버 (Authorization Server)
리소스 소유자를 인증하고 클라이언트에게 Access Token을 발급하는 서버이다. 소유자가 클라이언트에게 권한을 부여할지 결정하는 페이지를 제공하고 동의가 완료되면 토큰을 발급한다.
- 예시) 구글 계정 서비스
참고) 인가 서버와 리소스 서버는 항상 동일한 서버는 아니다.
2.4. 리소스 서버 (Resource Server)
클라이언트가 리소스 소유자를 대신하여 사용하고자 하는 API 또는 서비스를 관리하는 서버이다. 클라이언트가 Access Token을 제시하면 해당 토큰의 유효성 검사를 진행 후 자원 접근을 허용 또는 거부한다.
- 예시) 구글 캘린더 API
3. 주요 키워드
3.1. 리다이렉트 URI 또는 콜백 URL (Redirect URI or Callback URL)
사전에 등록된 클라이언트 URL을 인가 서버가 리소스 소유자의 권한 부여 후 다시 리다이렉션 할 URL이다.
HTTPS가 기본적으로 요구되지만 localhost와 같은 루프백 주소의 경우 HTTP가 예외적으로 허용될 수 있다. 유효하지 않은 URI로 리다이렉션 될 경우 권한 코드가 탈취될 위험이 있다.
3.2. 스코프 ( Scope)
클라이언트가 요청하는 자원 접근 또는 기능의 세분화된 권한을 의미하는 작업의 범위이다.
- 예시) 프로필 정보 읽기, 이메일 주소 접근, 연락처 목록 보기
3.3. Client ID & Secret
인가 서버에 클라이언트를 식별하는 데 사용되는 ID와 비밀번호이다.
- 예시) 구글 로그인 사용을 위한 Client ID 와 비밀번호
3.4. Access Token
클라이언트가 리소스 서버와 통신할 때 사용하는 키이다. 이는 클라이언트가 사용자를 대신하여 리소스 서버에서 데이터를 요청하거나 작업을 수행 할 수 있는 권한을 부여한다.
클라이언트가 자체적으로 읽을 수 없는 문자열이고 특정 스코프와 유효 기간을 가지고 있으며 만료될 경우 새로 갱신해야 한다.
Bearer Token이라고도 불리는데 이는 토큰을 소지한 누구든 사용할 수 있기 때문이다.
3.5. Refresh Token
Access Token을 새로 얻기 위해 사용되는 자격 증명용 코드이다. 현재 토큰이 만료되거나 유효하지 않을 때 갱신을 위해 사용된다.
2) OIDC
1. 개념
OpenID Connect 일명 OIDC는 OAuth 2.0 프로토콜 위에 구축된 얇은 식별 레이어이다.
OIDC의 주요 목적은 사용자 인증 및 사용자에 대한 기본 정보 획득이다.
2. 주요 키워드
2.1. ID Token
사용자의 인정 정보를 인코딩하는 새로운 유형의 토큰이다.
Access Token이 키 카드와 같다면 ID Token은 주민등록증과 같다. 즉, 접근 권한뿐만 아니라 로그인한 사람에 대한 프로필 정보를 제공한다.
- ID Token은 JWT (Json Web Token)으로 제공된다.
2.2. JWT (Json Web Token)
ID Token이 특정 형식으로 구성된 문자열이다. 클라이언트가 JWT에 포함된 정보를 추출할 수 있다.
JWT는 일반적으로 Header, Payload, Signature 총 세 부분으로 구성된다.
2.3. Claims
ID Token 안에 포함된 사용자에 대한 정보이다.
표준 클레임으로 iss (발급자), sub (주체 식별자), aud (대상), exp (만료 시간), iat (발급 시간) 등이 포함되고 추가적으로 Scope의 요청에 따라 더 많은 사용자 정보를 얻을 수 있다.
2.4. 식별 제공자 (Identity Provider: IdP)
OIDC를 지원하는 인가 서버이다.
2.5. 의존 당사자 (Relying Party: RP)
OIDC를 사용하여 최종 사용자 인증 및 정보를 IdP에 의존하는 OAuth 2.0 클라이언트 어플리케이션을 지칭하는 용어이다.
결론
OAuth 2.0은 권한 부여에 중점을 둔다면 OIDC는 누가 로그인 했는지를 파악하는데 중점을 둔다.
해당 포스트에는 두 표준에 대한 키워드와 개념을 설명했지만 다음 포스트에서는 동작 방식과 원리에 대해 작성하려고 한다.
읽어 주셔서 감사합니다!