요즘 어떤 홈페이지를 방문하여 로그인이 필요한 서비스를 이용하는 경우, 다음과 같은 장면을 보신적이 있을 겁니다.
바로 다른 계정으로 로그인하는 기능입니다.
이처럼 다른 계정으로 로그인하는 기능을 사용하면, 해당 사이트에 개별적으로 회원 가입을 진행하지 않아도 되기 때문에 매우 간편하며, 사이트별 아이디와 비밀 번호를 기억하지 않아도 된다는 장점이 존재하기 때문에 저는 매우 좋아합니다.
이제까지 로그인하면 Spring Security와 JWT를 사용한 로그인 기능만을 알고 있었으나, 요즘에는 이렇게 다른 소셜 계정을 통하여 로그인하는 방식을 많이 사용하는 것 같아서 어떠한 원리로 작동하며, 어떻게 구현할 수 있는지를 확인해보는 시간을 가졌습니다.
위에서 볼 수 있는 것처럼, 다른 소셜 계정을 통하여 서비스를 이용할 수 있는 원리는 바로 OAuth를 활용하여 만든 기능입니다.
자주 사용하는 구글, 페이스북, 네이버 계정을 통한 로그인 기능을 구현하기 위해서 가장 중요한 부분은 바로 해당 회원이 구글, 페이스북, 네이버의 회원이라는 것을 알아야합니다.
접근하는 사용자가 구글의 회원인지 아닌지를 판단하는 가장 빠르고 쉬운 방법은 사용자가 로그인할 때, 사용자의 구글 아이디와 비밀 번호를 알려주는 방식입니다.
사용자가 구글 아이디와 비밀번호를 입력하면, 우리는 해당 아이디와 비밀 번호를 통하여 로그인을 수행하고, 구글의 회원인지 아닌지를 쉽게 판가름할 수 있을 것입니다.
그러나, 이러한 방식은 매우 비현실적입니다.
일단 사용자의 입장에서, 누군지도 모르는 우리에게 아이디와 비밀 번호를 알려줄리가 없을 뿐더러, 서비스를 제공하는 우리 입장에서도 타인의 개인 정보를 다룬다는 점이 부담스럽습니다.
이러한 상호간의 문제점을 해결하기 위하여 사용하는 방식이 바로 OAuth입니다.
즉, OAuth를 사용하게될 경우, 구글 아이디와 비밀 번호 대신 구글의 회원임을 입증할 수 있는 수단이 생긴다는 뜻입니다.
그렇게된다면, 사용자 입장에서는 아이디와 비밀 번호를 제공함으로써 생기는 보안 문제에 대비할 수 있으며, 서비스 제공자 입장에서는 개인 정보를 다룸으로써 생기는 부담을 떨쳐낼 수 있습니다.
그렇다면 OAuth는 어떻게 동작할까요?
OAuth는 크게 4가지의 요소가 상호작용을 한다고 볼 수 있습니다.
사용자라고 생각하시면 될 것 같습니다.
구글, 네이버와 같이 사용자가 로그인하기위하여 가입되어있어야하는 사이트라고 생각하시면 될 것 같습니다.
Client에게 권한을 부여해주는 서버라고 생각하시면 될 것 같습니다.
사용자에게 서비스를 제공하는 우리라고 생각하면 될 것 같습니다.
OAuth를 이용한 인증 방식에는 여러가지가 존재하지만, 가장 널리 사용되고 안전한 방식인 Authorization Code Grant방식에 대하여 설명하겠습니다.
(출처 : https://junuuu.tistory.com/405?category=1014988)
해당 그림은 Authorization Code Grant 방식의 과정에 대하여 설명하고 있습니다.
혹여나 이해가 힘드신 분들을 위하여 예시를 들어서 설명하자면,
우리가 오늘의 날씨를 제공하는 API 서버를 만들었다고 가정해봅시다.
사용자는 서비스 제공을 요청합니다.
그러나 서비스 입장에서는 사용자가 로그인되어 있지 않기 때문에 로그인 먼저 해오라고합니다.
그럼 사용자는 로그인하기 위하여 인증 서버에 로그인 페이지를 요청하게됩니다.
이 과정이 바로 어떠한 계정을 통하여 로그인을 할지 결정하는 순간인데, 만약 네이버 아이디로 로그인하기를 선택하였을 경우, 네이버 인증 서버에 로그인 페이지를 요청하게됩니다.
사용자가 로그인 페이지를 요청했으므로, 인증 서버는 로그인 페이지를 제공해줍니다.
저는 페이스북 계정으로 로그인하기를 누르니, 이러한 창이 떴습니다.
로그인창에 사용자는 아이디와 비밀번호를 입력하여 자신이 해당 사이트의 회원임을 인증합니다.
만약 사용자가 해당 사이트의 회원일 경우, 인증 서버는 사용자에게 Authorization Code를 발급해줍니다.
이 Code를 통하여 사용자는 아이디와 비밀번호를 제공하지 않고도 해당 사이트의 회원임을 인증할 수 있습니다.
이 code를 가지고 사용자는 서비스에게 다시 요청합니다.
서비스는 이 코드를 인증 서버에게 제시하며, 해당 코드와 일치하는 사용자 정보에 접근할 수 있는 권한을 인증 서버에게 요구하는데, 이 권한이 바로 Access Token입니다.
서비스는 이 토큰을 통하여 토큰의 유효 기간동안 사용자의 정보를 얻을 권한을 가지게됩니다.
인증서버는 서비스가 제시한 코드의 유효성을 판단하여 유효하다고 판단할 경우 서비스에게 Access Token을 제공해줍니다.
그럼 사용자의 로그인이 완료된 것입니다.
이때부터 사용자는 이제 서비스 이용 요청을 보낼 수 있습니다.
일단 오늘은 이렇게 OAuth가 무엇이고, 동작 원리는 어떻게되는지에 대하여 간략하게 알아보았습니다.
내일은 OAuth를 사용해서 로그인 기능을 직접 구현해보고 동작하는 것까지 확인해보는 시간을 가져보겠습니다.
https://loosie.tistory.com/302?category=932704
https://junuuu.tistory.com/433?category=1014988
https://velog.io/@undefcat/OAuth-2.0-간단정리
https://developers.payco.com/guide/development/start