들어가며
소셜 로그인을 구현하면서 OAuth2.0에 대해 공부를 하게 되었다. 사실 각 소셜로그인이 제공하는 API를 호출하기만 하면 간단하게 해결되지만 언제나 기초 지식은 중요하기 때문에 따로 정리해보고자 한다!
들어가기에 앞서 OAuth2.0에 대해 더욱 자세히 알고 싶다면 다음 문서를 읽어보자!
OAuth2.0
OAuth2.0은 Open Authentication 2.0의 약자로 인증 및 권한 획득을 위한 업계 표준 프로토콜이다.
OAuth2.0은 보안수준이 어느 정도 검증된 플랫폼의 API(ex. google, naver, kakao등)를 이용하여 사용자 인증과 리소스에 대한 권한획득(인가)을 할 수 있도록 해주는 역할을 하고, 대부분의 영향력이 있고, OAuth2.0 인증을 제공하는 플랫폼들은 모두 OAuth2.0 규칙을 지키는 API를 제공하고 있다.
OAuth2.0이 등장한 이유?
기존의 아이디와 비밀번호를 사용하여 로그인하는 방식은 상대적으로 보안이 취약한 방식이다. 암호화를 거치더라도 비밀번호는 일반 텍스트를 이용하기 때문에 보안상 취약점이 존재하지만 서버는 비밀번호 인증방식을 사용할 수 밖에 없었다. 만약 여러 사이트에서 같은 아이디와 비밀번호를 사용하고 있다면, 한 사이트가 털렸을 때 모든 사이트의 비밀번호가 털렸다고 해도 무방하다고 볼 수 있다.
물론 사이트에 직접 아이디와 비밀번호로 회원가입-로그인 하는 방식이 무조건 나쁘다고 볼 수는 없지만 OAuth 인증을 통해서 신뢰할 수 있는 플랫폼이 인증을 하고, 리소스에 대한 권한을 외부 플랫폼으로 부여해주는 방식은 보다 안전하다고 볼 수 있다.
구성요소
- Resource owner : 제한된 리소스에 접근할 수 있는 권한을 가진 존재. (ex. 사용자)
- Resource server : 제한된 리소스를 호스팅하는 서버. Access Token을 이용해 제한된 리소스에 대해 요청하고 응답 받을 수 있다. (ex. 구글, 카카오, 네이버 같은 회사)
- Client : Resource owner의 인증을 가지고 제한된 리소스에 대해 요청을 보내는 어플리케이션 (ex. 내가 개발한 웹서비스, 외부 플랫폼)
- Authorization server : Resource owner가 인증 시도를 할 수 있고, 인증에 성공했다면 client에게 access token을 발급하는 서버. 인증서버
자격 증명 방식
권한 부여 승인 코드 방식(Authorization Code Grant)
일반적으로 서버 사이드에서 인증을 처리할 때 사용하는 방식으로, Authorization Code를 이용하여 Access Token을 요청하는 방식
권한 부여 승인 요청 시 response_type=code
, grant_type=authorization_code
로 지정하여 요청한다.
암묵적 승인 방식(Implicit Grant)
권한 코드 없이 바로 토큰을 발급하여 사용하는 방식으로 자격 증명을 안전하게 저장하기 힘든 클라이언트(ex. javascript)에게 최적화된 방식
권한 부여 승인 요청 시 response_type=token
으로 지정하여 요청한다.
자원 소유자 자격증명 승인 방식(Resource Owner Password Credentials Grant)
username과 password를 이용하여 바로 Access Token을 발급받는 방식으로 클라이언트가 자신의 서비스에서 제공하는 어플리케이션일 경우에만 사용하는 방식
권한 부여 승인 요청 시 grant_type=password
로 지정하여 요청한다.
클라이언트 자격증명 승인 방식(Client Credentials Grant)
클라이언트의 자격증명 만으로 Access Token을 획득하는 방식으로 자격증명을 안전하게 보관할 수 있는 클라이언트에만 사용한다.
권한 부여 승인 요청 시 grant_type=client_credentials
로 지정하여 요청한다.
마치며
간단하게 OAuth2.0에 대해 정리해보았다. 공식문서를 읽어보면 소셜 로그인 API를 사용할 때 들어가는 파라미터나 요청값들을 왜 이렇게 사용하는 지 더욱 명확하게 이해할 수 있으니 시간이 된다면 한번 훑어보는 걸 추천한다!
출처 및 참고
'Study > CS' 카테고리의 다른 글
[CS] CI/CD란? (0) | 2022.06.27 |
---|---|
[CS] 브라우저의 동작 원리 (1) | 2022.06.01 |
[CS] 동기 & 비동기 vs 블로킹 & 논블로킹 (2) | 2022.05.30 |
[CS] API란? (0) | 2022.04.10 |
[CS] Rest API: URL 디자인 가이드 (0) | 2022.02.11 |