본문 바로가기
TIL/기타

2021.8.23 TIL : 서버 인증 방법 (소셜 로그인, OAuth 2.0)

by yeon_zoo 2021. 8. 23.

Oauth는 외부 서비스의 인증 및 권한 부여를 관리하는 범용적인 프로토콜이다.

*OAuth를 통해서는 사용자의 권한에 따라서 접근할 수 있는 데이터가 다르도록 설정이 가능하다. 

**프로토콜은 일종의 규격이다. Facebook, Google, Naver 등은 OAuth라는 규격에 맞춰 인증 및 권한을 대행관리 해준다. 

***외부 서비스 : 여기서 외부 서비스는 내가 만들고자 하는 서비스이다. OAuth는 외부 서비스를 위한 서비스로 우리 서비스의 인증 및 권한 부여에 대한 관리를 대행해준다. 

 

우리가 이전에 배웠던 JWT, 세션/쿠키 방식을 완전히 대체하는 방식이 아니다. SNS 로그인 기능을 넣더라도 결국은 세션/쿠키 방식이나 토큰을 활용해 인증을 거쳐야 한다. 

 

OAuth 2.0의 인증 방식은 크게 네 가지이다.

1. Authorization Code Grant

2. Implicit Grant

3. Resource Owner Password Credentials Grant

4. Client Credentials Grant

 

이 중에서 배워볼 것은 Authorization Code Grant 이다. 

 

기본 정의

  • Resource Owner : User(일반 사용자)
  • Client : 우리가 관리하는 어플리케이션 서버(내가 만드는 서비스, User와 혼동 주의)
  • Authorization Server : 권한 관리 서버. Access Token, Refresh Token을 발급, 재발급 해주는 역할
  • Resource Server : OAuth 2.0을 관리하는 서버(구글, 페이스북 등)의 자원을 관리하는 서버. Oauth 2.0 관리 서버의 자체 API를 의미.

1. resource owner(사용자)가 Client(우리 서버)에 인증 요청을 한다.

2. Client는 Authorization Request를 통해 Resource Owner에게 인증할 수단(페이스북이나 구글 로그인 url)을 제공한다. 

3. resource owner은 해당 request를 통해 인증을 진행하고 인증을 완료했다는 신호로 Authorization grant를 url에 실어 client에게 보낸다.

4. client는 해당 권한 증서를 Authorization Server에 보낸다.

5. Authorization server는 권한증서를 확인한 후, 유저가 맞다면 client에게 access token, refresh token 그리고 사용자의 프로필 정보 등을 발급해준다.

6. client는 해당 access token을 DB에 저장하거나 resource owener에게 넘긴다.

7. resource owner가 resource server에 자원이 필요하면 client는 access token을 담아 resource server에 요청한다. 

8. resource server는 access token이 유요한지 검증한 후 client에게 자원을 보낸다.

9. 만일 access token이 유효하지 않다면(만료된 경우나 위조된 경우), client는 authorization server에 refresh token을 보내 access token을 재발급받는다. 

10. 그 후, 다시 resource server에 요청을 보낸다.

11. 만약 refresh token도 만료된 경우, 사용자(resource owner)는 새로운 authoriation grant를 client에게 넘겨야 한다.(즉, 다시 로그인해야 한다)

 

우리가 사용하려고 하는 SNS 로그인 기능도 OAuth 2.0 프레임워크를 사용하기 때문에 위의 과정과 비슷하다. 더 명확하게 소셜 로그인 기능의 과정을 설명해보면 다음과 같다. 

1. 사용자는 서버에게 로그인을 요청한다.

2. 서버는 사용자에게 특정 쿼리들을 붙인 페이스북 로그인 url을 사용자에게 보낸다.

3. 사용자는 해당 URL로 접근하여 로그인을 진행한 후 권한증서(code)를 담아 서버로 보낸다. 

4. 서버는 해당 권한 증서를 Facebook의 Authorization Server로 요청한다.

5. authorization server는 권한 증서를 확인한 수, Access token, refresh token, 유저의 정보(고유 id 포함) 등을 돌려준다.

6. 받은 고유 id값을 key값으로 DB에 사용자가 있다면 로그인, 없다면 회원가입을 진행한다.

7. 로그인이 완료되었다면 세션/쿠키, 토큰기반 인증 방식을 통해 사용자의 인증을 처리한다. 

 

참고 블로그 : https://tansfil.tistory.com/60

댓글