본문 바로가기

웹 프로그래밍/BackEnd

[Backend] OAuth란?(+ 동작방법)

프로젝트를 진행하면서 OAuth라는 것을 알게 되었다.

OAutt는 간단히 말하면 무슨 토큰 같은거로 로그인을 대신한다 생각하면 되는데 

굳이? 라는 생각이 들었다.

 

그렇다면 OAuth는 왜 생겨 났을까?

만약 내가 서비스 하나를 만들었다고 치자

이 서비스에서 네이버에 등록된 유저의 정보가 필요 하다면?

예전에는 사용자로부터 아이디와 비밀번호를 받은 다음에 이걸 가지고 네이버에 로그인을 했었다.

 

하지만 이렇게 되면 무슨 문제가 있을까?

개인의 서비스들은 기업에 비해 보안이 너무 취약하다...

 

누군가가 우리 서비스에 있는 고객의 아이디와 비밀번호를 탈취한다면?

고대로 털리는 것이다.. 심지어 네이버입장에서도 고객의 정보가 유출되는 셈이다.

 

그러면 어떻게 아이디와 비밀번호를 우리 서비스에 안넘기고 네이버에 접근할 수 있지?

그래서 OAuth가 나온것이다.

다른 서비스의 회원정보를 안전하게 사용하기 위해서 말이다!

고객이 우리 서비스에 아이디, 비밀번호를 넘겨주지 않고도 네이버에 있는 고객 정보를 우리 서비스에서 사용할 수 있게 된다. 이게 OAuth의 전부이다.(사실 아닐수도..ㅎㅎ)

현재 OAuth는 2.0이 표준이다. 

OAuth의 역사에 대해서는 다음에 알아보고

 

OAuth가 어떻게 동작하는지 알아보자

우리가 만든 서비스가 네이버로 로그인하기를 구현한다고 가정하자.

여기서 OAuth에 참여자는 다음과 같다.

Client(우리의 서비스) : 리소스에 접근하려고하는 주체

Resource : 서비스 제공자에 저장된 정보

Resource Owner : Client에 제공하는 정보를 가지고 있는 고객, 여기서는 우리 서비스를 이용하는 사용자

Service Provider : 리소스를 저장하고 있는 주체, Client가 여기에 접근해 고객의 정보를 요청한다. 여기서는 네이버에 해당한다.

 

 

 

첫번째로 우리의 서비스가 믿을만한 서비스라는 것을 네이버에게 증명해야한다.

Service Provider에게 Client(우리서비스)의 정보를 등록해야한다.

사용등록을 하게 되면 Client Id와 Secret key가 생성된다.

이 두개를 이용해서 Client를 식별하고 신원을 확인하는데 사용된다.

또한 설정을 해줄때 redirect URI를 등록하게 된다.

이는 토큰을 어디로 보내주면 될지 알려주는 역할을 한다.

 

 

두번째로 사용자가 인증요청을 하고 우리서비스가 권한 부여를 요청해야 한다.

우리가 만든 서비스에 사용자가 네이버로 로그인 하기를 눌렀다고 가정하면 

페이지에서는 네이버에 권한 부여를 위해 사용자에게 승인을 받게 됩니다.

다들 구글로 로그인하기 누르면 권한을 승인하는 창이 나오는데 이게 그겁니다!!

 

우리서비스가 권한을 요청할때는 맨처음에 등록한  Client ID와 어떤 정보를 사용할 건지에 대한 scope, 사용자의 리소스 사용 승인시 인가코드를 전달할 redirect URI를 파라미터로 넘겨 요청을 보낸다.

 

이렇게 요청을 보내고 나면 사용자가 네이버 리소스 사용을 승인하라는 페이지로 이동하게 됩니다.

이 페이지에서 어떤 어떤 권한을 요청하고 있는지 사용자에게 보여주고 사용자가 동의를 하게 되면 인증이 성공하게 된다.

 

 

세번째로 인증을 성공하고 나면 인가코드를 부여한다.

사용자가 인증및 권한 사용 승인을 마치게 되면 네이버의 인증서버는 access token을 발급 받기위한 인가코드(Authentication Code) 302(redirect) 상태를 통해 사용자모르게 우리의 서비스로 전달해준다.

이 인가 코드(Authentication Code)는 "우리의 서비스가 사용자에게 허락을 받았다"라는 증명서와 같은 역할을 한다.

이제 네이버에게 Access Token을 받을 준비가 되었다!!

 

 

네번째는 Access Token 발급을 요청하는 것이다.

우리의 서비스는 Client Id, Secret Key, Redirect URI, 인가코드를 가지고 네이버에게 Access Token 발행을 요청한다.

이후 네이버의 인증서버는 리소스에 접근할 수 있는 Access Token을 생성하고 우리 서비스에게 보내준다.

이때 Access Token뿐만 아니라 Refresh Token도 같이 넘겨주게 되는데 Access Token이 보안을 위해 유효기간이 짧게 설정되어 있는데 이렇게 되면 사용자가 로그인할때마다 네이버에게 사용허가를 받아야 하므로 불편하다.

Refresh Token은 Access Token을 다시 발급받을 수 있는 Token으로 사용자에게 다시 승인 요청할 필요 없고, 유효기간이 더 길다.

하지만 이 토큰이 탈취되면 쉽게 Access Token을 가져올 수 있으므로 보안에 유의해야하고 서비스 DB에 넣어두고 사용한다.

 

 

 

다섯번째로 발급받은  Access Token을 통해 네이버의 리소스에 접근요청을 한다.

Access Token을 받고 난뒤 요청을 보내게 되면, 지정된 scope에 대한 접근이 맞다고 판단되면 정보를 보내준다.

 

 

여섯번째로 토큰의 유효기간이 만료되었을때 재발급을 요청하는 경우이다.

시간이 지나 Access Token이 만료되면 Refresh Token을 이용해 토큰을 새로 발급 받을 수 있다.

 

이렇게 OAuth가 뭔지, 어떻게 동작하는지 알아보았다. 

인증방식에는 4가지 방법이 있다고 하는데 그건 다음시간에..ㅎㅎ

 

끝!

 

참고링크 : https://gdtbgl93.tistory.com/180

반응형
SMALL