Delphi PKCE OAuth2

· 기능

sgcWebSockets 2024.5.0부터 "Proof of Key Code Exchange"의 약자인 PKCE를 지원해요. OAuth 2.0 프로토콜의 확장으로 코드 가로채기 공격을 방지하는 데 도움이 돼요.

PKCE는 OAuth2 서버클라이언트 컴포넌트에서 지원돼요.

PKCE란 무엇인가

PKCE(Proof Key for Code Exchange)는 공개 또는 네이티브 애플리케이션에서 인증 코드 가로채기 공격으로부터 보호하기 위해 설계된 OAuth 2.0 보안 강화 기능이에요. RFC 7636에 자세히 설명되어 있으며 특히 모바일이나 클라이언트 측 애플리케이션처럼 클라이언트 시크릿을 안전하게 보관하기 어려운 환경에서 "인증 코드 가로채기" 취약점에 대한 완화 기법이에요.

일반적인 OAuth 2.0 인증 코드 부여 흐름에서 클라이언트 애플리케이션은 사용자를 인증 서버로 리디렉션하여 인증 코드를 얻은 후 코드를 액세스 토큰으로 교환해요. 하지만 공격자가 인증 코드를 가로채면 액세스 토큰을 얻어 보호된 리소스에 접근할 수 있어요.

PKCE는 증명 키 메커니즘을 도입하여 이 위험을 해결해요. PKCE의 주요 구성 요소는 다음과 같아요:


PKCE 흐름은 다음과 같이 작동해요:

  1. 클라이언트 애플리케이션이 코드 검증기를 생성하고 코드 챌린지를 도출해요.
  2. 클라이언트 애플리케이션이 코드 챌린지와 코드 챌린지 방법(plain 또는 S256)을 포함하여 OAuth 인증 요청을 시작해요.
  3. 사용자가 접근을 허용하면 인증 서버가 클라이언트에 인증 코드를 보내요.
  4. 클라이언트 애플리케이션이 액세스 토큰으로 교환하기 위해 토큰 엔드포인트에 인증 코드를 보낼 때 코드 검증기도 함께 포함해요.
  5. 인증 서버가 코드 챌린지를 생성할 때 사용한 동일한 변환 방법을 적용하여 코드 검증기를 확인하고 저장된 코드 챌린지와 일치하는지 확인해요.
  6. 확인이 성공하면 인증 서버가 액세스 토큰을 발급하고, 그렇지 않으면 요청이 거부돼요.

이 메커니즘은 원래 코드 검증기가 있는 클라이언트만 인증 코드를 액세스 토큰으로 성공적으로 교환할 수 있도록 보장하여 OAuth 흐름에 견고한 보안 레이어를 제공해요.

Delphi OAuth2 클라이언트

TsgcHTTP_OAuth2_Client 컴포넌트는 인증 코드 + PKCE 흐름을 지원해요. 이 인증 유형을 사용하려면 GrantType 속성을 auth2CodePKCE로 설정하세요.

oAuth2 := TsgcHTTP2_OAuth2.Create(nil);
oAuth2.LocalServerOptions.Host := '127.0.0.1';
oAuth2.LocalServerOptions.Port := 8080;
oAuth2.AuthorizationServerOptions.AuthURL := 'https://accounts.google.com/o/oauth2/auth';
oAuth2.AuthorizationServerOptions.TokenURL := 'https://accounts.google.com/o/oauth2/token';
oAuth2.AuthorizationServerOptions.Scope.Add('https://mail.google.com/');
oAuth2.OAuth2Options.ClientId := '180803918357-eqjtn20gqfhcs6gjkebbrrenh022mqqc.apps.googleusercontent.com';
oAuth2.OAuth2Options.ClientSecret := '_by0iYYrvVHxC2Z8TbtNEYQN';
oAuth2.OAuth2Options.GrantType := auth2CodePKCE;
procedure OnOAuth2AfterAccessToken(Sender: TObject; const Access_Token, Token_Type, Expires_In, 
  Refresh_Token, Scope, RawParams: string; var Handled: Boolean);
begin
  <...>
  <...>
end;
oAuth2.OnAfterAccessToken := OnOAuth2AfterAccessToken;
oAuth2.Start; 

Delphi OAuth2 서버

TsgcHTTP_OAuth2_Server 컴포넌트는 기본적으로 PKCE를 지원해요(OAuth2Options.PKCE 속성에서 비활성화할 수 있어요). 서버가 OAuth2 클라이언트가 PKCE를 사용하고 있음을 감지하면 PKCE 값이 유효한지 확인하고, 유효하지 않으면 응답이 오류를 반환해요.

Delphi OAuth2 서버 사용 방법은 아래 링크를 참조하세요.

https://www.esegece.com/help/sgcWebSockets/#t=Components%2FHTTP%2FAuthorization%2FOAuth2%2Fserver%2FQuickStart%2FOAuth2_Server_Example.htm