OAuth (Open Authorization) 은 사용자가 자원의 접근 권한을 다른 애플리케이션 또는 서비스에게 위임하는 프로토콜이다.
OAuth의 주요 목적은 사용자가 자신의 계정 정보(예: 소셜 미디어 계정)를 직접 제공하지 않고도 제3자 애플리케이션이나 서비스가 해당 계정의 일부 자원에 접근할 수 있도록 하는 것입니다. 이를 통해 사용자는 자신의 개인 정보를 보호하면서도 다른 애플리케이션과의 통합을 용이하게 할 수 있다.
OAuth의 목적은 중개인과 네이버의 통신이 아니라 브라우저와 중개인의 통신이다. OAuth를 사용하면 클라이언트 애플리케이션이 사용자의 비밀번호를 직접 요구하지 않고, 대신 인증 서버를 통해 액세스 토큰을 얻을 수 있다. 이를 통해 사용자의 비밀번호가 클라이언트 애플리케이션에 노출되지 않아 보안성을 향상시킬 수 있다.
OAuth 중 2가지 방식을 알아보자.
1. 클라이언트 자격 증명 그랜트 (Client Credentials Grant)
Credentials 방식은 클라이언트가 토큰을 이용해 인증을 하는 방식이다.
1.1 대칭키 방식
방식은 그림과 같다. 우선 클라이언트가 ex.네이버 와 같은 서버에 로그인 요청을 한다. 그러면 네이버는 클라이언트의 로그인 정보를 토큰에 담아 클라이언트에게 전달한다. 클라이언트는 이 토큰을 권한을 위임할 서버에 전달한다.
대칭키 방식은 토큰 인증을 토큰을 발행한 서버에서만 인증 가능하기 때문에, 스프링 서버는 네이버에 토큰의 신뢰성을 검증 후 OAuth가 시작 된다.
1.2 비대칭키 방식
비대칭키 방식같은 경우 토큰이 네이버의 비밀키로 암호화 되어있다. 이는 네이버의 공개키로 검증이 가능하기 때문에 스프링 서버는 네이버와 통신할 필요없이 OAuth가 시작된다.
대칭키 방식에서 스프링 서버(중개인)은 클라이언트의 요청 시 마다 토큰을 검증하기 위해 매순간 인가 서버와 통신을 해야 한다. 이를 막기 위해 스프링 서버는 클라이언트의 인증이 완료된 후 인가 서버에서 제공한 토큰을 버리고 새로운 토큰을 클라이언트에 제공해야 한다.
2. 인가 코드 그랜트 (Authorization Code Grant)
Code 방식은 토큰 대신 코드를 받는 방식이다.
Code 방식은 그림처럼 네이버에게 임시 코드를 받고, 스프링 서버는 임시 코드를 가지고 네이버에 인증을 받는다. 코드 인증이 정상적으로 되면 스프링 서버는 네이버에게 토큰을 받아 인증을 완료한다.
인가 코드 그랜트 방식은 보안성과 사용자 인증, 액세스 토큰 제한, 장기적인 액세스 토큰 보관 등의 장점을 가지고 있다. 이를 통해 클라이언트 애플리케이션의 보안과 사용자의 개인정보 보호를 강화할 수 있다.
브라우저는 여러명이 사용할 수 있기 때문에 토큰보다 코드 방식이 보안에 유리하다. 다만 모바일 앱의 경우 본인만 사용하기 때문에 토큰-비대칭키를 사용하면 중개인과 인가 서버의 통신이 필요없어 유리하다.
Share article