온라인 서비스의 사용자 인증 및 권한 부여의 문제점
온라인 서비스가 발전함에 따라 사용자 인증과 권한 부여는 중요한 이슈가 되었습니다. 전통적으로 사용자 이름과 비밀번호를 통해 인증하는 방식은 아래와 같은 문제를 가지고 있어요.
OAuth 2.0이 이러한 문제를 어떻게 해결할까요?
이러한 이유로 OAuth 2.0은 현대 웹 및 앱 개발에서 필수적인 인증 및 권한 관리 방식으로 자리 잡았습니다.
OAuth란 무엇인가요?
OAuth는 'Open Authorization'의 약자로, 비밀번호를 제공하지 않고도 웹사이트나 애플리케이션이 사용자의 데이터에 접근할 수 있도록 하는 개방형 표준입니다.
2010년 IETF에서 발표된 OAuth 1.0을 시작으로, 현재는 그 문제점을 보완한 OAuth 2.0이 널리 사용되고 있습니다.
OAuth의 주요 역할
즉, 사용자는 비밀번호 없이 접근 권한을 위임하고, 로그인 및 정보 관리를 제3자 애플리케이션(구글, 네이버 등)에 맡길 수 있습니다.
OAuth 2.0 로그인 프로세스는 다음과 같은 단계로 이루어집니다.
사용자(Resource Owner)가 우리 서비스의 'SNS로 로그인하기' 등의 버튼을 클릭하면 클라이언트(Client)는 OAuth 프로세스를 시작하기 위해 사용자의 브라우저를 Authorization Server로 보내야 해요.
클라이언트는 Authorization Server가 제공하는 Authorization URL에 response_type, client_id, redirect_uri, scope 등의 매개변수를 쿼리 스트링으로 포함하여 보내야 해요.
다음과 같이 정해진 규칙이 있어요. 하지만 Third-Party Application에 따라 방식이 다르긴 해요.
&client_id=29352735982374239857
&redirect_uri=https://example-app.com/callback
&scope=create+delete
Resource Owner가 클라이언트가 빌드한 Authorization URL로 이동해요. 로그인 페이지에서 사용자가의 sns 아이디와 비밀번호 등을 입력하여 인증해요.
인증이 성공하면, Authorization Server는 제공된 Redirect URI로 사용자를 리디렉션 하게 만들어요. 이때, Redirect URI에 Authorization Code를 포함하고 있어요.
이때, Authorization Code는 Client가 Access Token을 획득하기 위해 사용하는 임시 코드에요. 이 코드의 수명은 일반적으로 1~10분 정도로 굉장히 짧아요.
Client는 Authorization Code를 Authorization Server에 전달하면, Access Token을 응답받아요. Client는 발급받은 Resource Owner의 Access Token을 저장하고, 이후 Resource Server에서 Resource Owner의 리소스에 접근하기 위해 Access Token을 사용하게 되요.
❗️ Access Token은 유출되어서는 안 되므로 HTTPS 연결을 통해서만 사용해야 해요. Authorization Code와 Access Token 교환은 token 엔드포인트에서 이뤄지고 있어요.
필수로 전달해야 하는 매개변수는 다음과 같습니다.
grant_type
: 항상 “authorization_code”에요.code
: 로그인 인증 요청 API 호출에 성공하고 리턴받은 인증코드값redirect_uri
: Redirect URIclient_id
: Client IDclient_secret
: RFC 표준상 필수는 아니지만, Client Secret이 발급된 경우 포함하여 요청해야 합니다.위 과정을 성공적으로 마치면 Client는 Resource Owner에게 로그인이 성공하였음을 알리면 되요.
이후, Resource Owner가 Resource Server의 리소스가 필요한 기능을 Client에 요청해요. Client는 위 과정에서 발급받은 Access Token을 사용하여 제한된 리소스에 접근하고, Resource Owner에게 자사의 서비스를 제공할 수 있게 되요.
카카오 애플리케이션을 등록하기 위해 Kakao Developers로 이동합니다.
이제 로그인 구현하는데 필요한 정보들을 가져와야하는데 우리가 카카오 서버로 요청을 보낼때
GET /oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code
이런식으로 보내야해서 필요한 REST_API_KEY 와 REDIRECT_URI을 가져와야합니다.
앱 설정에 앱 키 항목에 들어가 REST API키를 Client_id로 사용할 겁니다.
여기까지 진행했다면 위에 Oauth2.0 로그인 과정에서 6번까지 완료한 상태입니다.
이제 Oauth2.0 프로세스의 7번을 하기위해 토큰을 요청하고 받아와야합니다.
카카오에서는 REST_API_KEY , REDIRECT_URL, 인가코드들만으로도 토큰을 받을수도 있지만 토큰을 발급할때 좀 더 보안을 강화하기 위해 Client Secret을 받아봅시다.
Client Secret을 받는 위치는 내 애플리케이션 -> 제품 설정 -> 카카오로그인 -> 보안 입니다.
Client Secret을 받고난후 밑에 활성화 상태를 사용함으로 변경해주어야합니다.
자신의 상황에 맞춰 동의항목을 설정하면 됩니다.
애플리케이션 등록을 위해 네이버 개발자 센터로 이동합니다.
네이버에서는 client_id, redirect_uri, response_type, state 파라미터를 사용해서 네이버 로그인 페이지 URL 을 만들어요.
client_id는 애플리케이션이 등록 후 확인 할 수 있으니 여기서는 동의항목과 서비스 url과 redirect_url만 설정해주면 됩니다.
?response_type=code
&client_id=MyHoVO2X8kk7l9O3xpjF
&state=test
&redirect_uri=http://localhost:8080/naver/callback
다음 편에는 스프링 시큐리티와 java와 springboot를 활용해 코드 구현 과정을 포스팅하겠습니다.
Reference