일반 로그인과 OAuth2 소셜 로그인의 가장 큰 차이는 사용자의 자격 증명을 누가 검증하느냐입니다.
일반 로그인은 사용자가 우리 서비스에 아이디와 비밀번호를 제출하고, 우리 서버가 저장된 비밀번호 해시와 비교해 직접 인증합니다. 따라서 비밀번호 저장, 변경, 재설정과 같은 계정 보안도 서비스가 직접 책임집니다.
반면 소셜 로그인은 카카오나 구글 같은 외부 제공자가 사용자를 인증합니다. 우리 서버는 인가 코드를 받아 액세스 토큰으로 교환하고, 사용자 정보 API를 호출하거나 OIDC의 ID Token을 검증하여 사용자를 식별합니다. 이후 제공자와 제공자 측 사용자 식별자를 기준으로 내부 회원을 조회하거나 가입시키고, 자체 세션이나 JWT를 발급합니다.
소셜 로그인은 소셜 계정의 비밀번호를 직접 관리하지 않아도 된다는 장점이 있지만, 외부 제공자의 장애나 정책에 영향을 받고 토큰과 리다이렉트 URI, 계정 연결을 안전하게 관리해야 합니다.
OAuth 2.0과 OpenID Connect는 무엇이 다른가요?
OAuth 2.0은 사용자가 가진 자원에 대한 접근 권한을 위임하는 인가 프레임워크입니다. OpenID Connect는 OAuth 2.0 위에 인증 계층을 추가하여 ID Token을 통해 사용자의 로그인과 신원 확인을 표준화합니다. 따라서 소셜 로그인에는 가능하면 OIDC를 사용하는 것이 명확합니다.
state,nonce, PKCE는 각각 무엇을 방어하나요?
state는 인증 요청과 콜백을 연결하여 로그인 CSRF를 방어하고, OIDC의nonce는 ID Token을 요청과 연결하여 재사용 공격을 방지합니다. PKCE는 인가 코드를 탈취하더라도 최초 요청자가 가진 Code Verifier 없이는 토큰으로 교환하지 못하게 합니다.
소셜 로그인 후 제공자의 Access Token을 우리 서비스 인증에 그대로 사용해도 되나요?
일반적으로 제공자 Access Token은 해당 제공자의 API를 호출하기 위한 토큰입니다. 우리 서비스는 검증된 사용자 식별자를 내부 회원과 연결한 뒤 자체 세션이나 토큰을 발급하여 인증 경계를 분리하는 것이 좋습니다.