OAuth2 인증 - 인가 코드 그랜트
지난 포스팅에는 OAuth2 인증 - 암시적 코드 그랜트에 대해서 살펴보았다. 이번 포스팅에는 이어서 인가 코드 그랜트에 대해서 알아보자.
OAuth2 인가 코드 그랜트를 이용해서 페이스북 친구 목록 요청
신뢰 클라이언트는 <자격증명>과 같은 기밀정보를 안전하게 저장할 수 있다. 따라서 등록 과정에서 저장할 자격증명을 발급 받는다. 아래는 OAuth2 인가 코드 그랜트를 이용해서 페이스북 친구 목록 요청하는 과정이다. 이번에도 페이스북의 사용자 동의 절차가 포함된다.
인증과정에서 1번-3번은 암시적 코드 그랜트와 과정이 동일하다. 굳앱이 유저를 페이스북으로 연결하고 페이스북은 유저에게 굳앱이 사용자 목록에 접근하는것을 허용할 것인지 물어본다. 사용자가 확인을 했다고 가정하고 진행을 한다.
(4) 페이스북은 <굳앱서버>에게 사용자의 페이스북에 접근할 수 있는 태그를 전달한다. 키가 아니라 태그이다. 그리고 클라이언트에게 전달하는 것이 아니라 서버에게 전달 한다.
(5) 굳앱서버는 페이스북이 전달해준 태그를 이용해서 사용자의 페이스북 친구 목록에 전달하는데 사용할 수 있는 키를 요청한다.
(6) 페이스북은 전달된 태그를 확인하고 굳앱 서버에게 키를 전달 한다.
(7) 굳앱서버는 키를 이용해서 페이스북에게 사용자의 친구목록을 요청한다.
(8) 페이스북은 전달된 키를 확인 후 굳앱서버에게 사용자의 친구목록을 전달 한다.
(9) 굳앱서버는 확인 후 사용자(클라이언트)에게 친구목록을 보여준다.
일단 사용자가 굳앱이 자신의 페이스북 친구목에 접근하는 것을 허락하면 페이스북은 굳앱에게 태그를 전달 한다. 태그는 이후에 키와 교환 된다. 최종적으로 굳앱서버는 키를 이용해서 페이스북에게 친구목록을 요청한다. 여기서 태그는 일회성 데이터이고, 한번 사용하면 재사용될 수 없다. 태그를 어려운말로하면 <인가코드>라고도 한다. 이 <인가코드>는 보호된 리소스에 접근을 요청할 때 사용되는 <엑세스 토큰>과 교환 된다. 즉, 키를 어려운말로 <엑세스토큰> 이라고도 한다. 굳앱서버는 <엑세스토큰>을 이용해서 페이스북 특정 사용자의 친구목록을 요청한다.
여기서 암시적 코드그랜트와 인가 코드 그랜트의 차이점은 <엑세스토큰>이 브라우저에게 전달되지 않는다는 것이다. 암시적 그랜트에서는 <엑세스토큰>이 클라이언트 웹브라우저에게까지 전달 되었다면, 인가 코드 그랜트에서는 <엑세스토큰>이 서버간에 이동되기 때문에 중간에 탈취될 위험성은 적다.
언제 인가 코드 그랜트를 사용하나?
인가 코드 그랜트는 신뢰 클라이언트를 위해서 만들어 졌다. 그렇기 때문에 정보를 안전하게 저장하고, 전송할 수 있는 서버에서 사용해야 한다. 설계에 따라서 네이티브 모바일 애플리케이션도 신뢰 클라이언트라고 생각 할 수도 있다.
(1) 서버와 연동해서 동작하는 네이티브 아이폰 애플리케이션
(2) 클라이언트는 안드로이드고 서버는 자바로 구성된 애플리케이션
인가 코드 그랜트의 장단점
장점
더 안전하다. 키는 서비스 제공자와 서버 사이드의 클라이언트 애플리케이션간에만 공유되고 브라우저에는 전달 되지 않기 때문에, 키가 탈취될 확율이 낮다.
장기간 오프라인 접근가능: 클라이언트 서버가 정보를 안전하게 저장할 수 있으므로, 사용자의 데이터에 접근하기 위해 필요한 키 등의 정보를 저장해서 장기간, 심지어 오프라인으로 접근할 수 있다.
단점
복잡하다. 안전하다는 장점을 이용하기 위해서는 좀더 복잡한 키교환을 가능하게 해주는 인프라가 필요하다.
암시적 코드 그랜트와 인가 코드 그랜트의 차이점
단순함 | 보안성 | 접근 지속 시간 | |
인가 코드 그랜트 | 복잡하다. 기밀데이터를 안전하게 저장하고 전송하려면 벡엔드 서버와 데이터 저장소가 유지되어야 한다. | 더 안전하다. 서버 사이드에서 키를 노출 시키지 않기 때문에 키가 탈취될 가능성이 적다. | 장기간 지속가능. 인가 코드 그랜트를 사용하는 애플리케이션은 기밀 데이터를 안전하게 저장한다고 신뢰를 받기 때문에 사용자의 데이터에 장기간 접근하는데 필요한 키등의 정보를 저장할 수 있다. |
암시적 코드 그랜트 | 단순하다. 비신뢰 클라이언트는 보안과 관련된 요구사항이 낮기 때문에 백엔드 서버나 데이터 저장소가 필요하지 않다. 모든것을 브라우저에서 수행가능하다. | 보안성이 낮다. 키가 브라우저로 전달되기 때문에 키가 인가 되지 않은 사람에 의해 탈취될 확율이 높다. | 단기간 지속가능. 비신뢰 애플리케이션이기 때문에 토큰이 유출될 가능성이 그만큼 크므로 단기간 사용할 수 있는 토큰만 사용해야 한다. |
'웹개발 > 보안' 카테고리의 다른 글
카카오 로그인 OAuth2.0 - 사용자 정보 조회 (0) | 2020.12.08 |
---|---|
카카오 로그인 OAuth2.0 (0) | 2020.12.08 |
OAuth2 인증 - 암시적 코드 그랜트 (0) | 2020.12.05 |
스프링 Session 쇼핑몰 방금 본 상품&권한체크 (0) | 2020.12.05 |
스프링 Session으로 자동 로그인 구현하기 (0) | 2020.12.01 |