2019/05/30 - [프로그래밍 노트/WEB] - REST API 보안_1
※ 모든 REST API보안관련된 내용은 거의 내용이 비슷하다고 봐도 무방할정도로 조대협님의 블로그를 참고하였다. 쉽고 자세하게 설명이되 있어서 .. 블로그 구독을 눌렀다. (조대협님의 블로그)
여러가지 인증 방법의 장단점을 잘 이해하여 서비스 주준에 맞는 적절한 API 인증 방식을 선택하자.
인증(Authentication)방식
1.API Key 방식
가장 기초적인 방식으로, API Key
를 사용자에게 제공하여 유효한 API Key를 가진 사용자들만 API사용을 허용하는 방식이다.
API Key는 일종의 문자열이며, API를 사용하고자 할 때 개발자는 API 제공자의 포탈 페이지 등에서 API Key를 발급 받고, API를 호출할 때 API Key를 메시지 안에 넣어 호출한다. 서버는 메시지 안에서 API Key를 읽어 이 API가 누가 호출한 API인지를 인증하는 흐름이다.
모든 클라이언트들이 같은 API Key를 공유하기 때문에 한번 API Key가 노출이 되면 전체 API가 뚫려 버리는 문제가 있기 때문에 높은 보안 인증을 요구하는 경우에는 권장하지 않는다.
2.API Token 방식
사용자 ID, PASSWORD 등으로 사용자를 인증한 후에, 그 사용자가 API 호출에 사용할 기간이 유효한 API Token
을 발급하여 API Token으로 사용자를 인증하는 방식이다.
API 호출 시 사용자의 ID, PASSWORD를 보내지 않고 Token을 보내는 이유는 사용자 PASSWORD는 주기적으로 바뀔 수 있고, 매번 네트워크를 통해서 ID, PASSWORD를 보내는 것은 보안상 위험하기 때문에 Token을 사용한다.
- API Client가 ID, PASSWORD를 전송하여 API Token을 요청한다.
- API 인증 서버는 ID, PASSWORD를 가지고 사용자 정보를 바탕으로 사용자 인증을 한다.
- 인증된 사용자에 대해서 API Token을 발급한다.
- API Client는 이 API Token으로 API를 호출한다. API Server는 API Token이 유효한지를 API관리 서버에 문의 후 유효하면 API 호출을 받아들인다.
이 인증방식에는 여러가지 변종이 존재하는데 먼저 1단계의 사용자 인증 단계에서 보안 수준에 따라 여러가지 방식을 사용할 수 있다.
- HTTP Basic Auth
- Digest access Authentication
- 클라이언트 인증 추가
- 제3자 인증 방식
- 등등
클라이언트 인증 추가
추가적으로 보안 강화를 위해서 사용자 인증 뿐만 아니라, 클라이언트 인증 방식을 추가할 수 있다.
페이스북의 경우 API Token을 발급 받기 위해서, 사용자 ID, PASSWORD 뿐만 아니라 Client Id
와 Client Secret
이라는 것을 같이 입력 받도록 한다.Client Id
는 특정 앱에 대한 등록 ID이고, Client Secret
은 특정 앱에 대한 비밀 번호로 페이스북 개발자 포털에서 앱을 등록하면 앱 별로 발급되는 일종의 비밀번호이다.
API Token을 발급 받을 때, Client Id
와 Client Secret
을 이용하여 클라이언트 앱을 인증하고 사용자 ID, PASSWORD를 추가로 받아서 사용자를 인증하여 API Access Token을 받는다.
제3자 인증 방식
페이스북이나 트위터와 같은 API 서비스 제공자들이 파트너 애플리케이션에 많이 적용하는 방법이다.
My Server Application이라는 서버를 Facebook 계정을 이용하여 인증하는 과정은 아래와 같다.
※ My Server Application은 해당 사용자가 페이스북 사용자임을 인증해 주지만, 서비스 My Server Application은 사용자의 비밀번호를 받지 않고, 페이스북이 사용자를 인증하고 서비스 My Server Application에게 알려주는 방식이다.
즉, 파트너 서비스에 페이스북 사용자와 비밀번호가 노출되지 않는 방식이다.
- 페이스북의 Developer Portal에 접속하여, 페이스북 인증을 사용하고자 하는 애플리케이션 정보를 등록한다. (서비스 명, 서비스 URL, 인증이 성공했을 때 인증 성공 정보를 받는 Callback URL)
- 페이스북 Developer Portal은 등록된 정보를 기준으로 애플리케이션에 대한 client_id, client_secret을 발급한다. (클라이언트 인증에 사용된다.)
- 개발하고자 하는 애플리케이션에 이 client_id와 client_secret을 넣고 페이스북 인증 페이지 정보등을 넣어서 애플리케이션을 개발한다.
애플리케이션이 실행되면, 아래와 같은 흐름에 따라 사용자 인증을 수행한다.
- 웹브라우저에서 사용자가 My Server Application 서비스에 접근 요청을 한다.
- My Server Application은 사용자가 인증되어있지 않기 때문에, 페이스북 로그인 페이지 URL을 HTTP Redirection으로 브라우저에 전달한다. 이때 URL에 페이스북에 로그인 요청이 My Server Application에 대한 사용자 인증 요청임을 알려주기 위해, client_id 등의 추가 정보를 함께 전송한다.
- 브라우저는 페이스북 로그인 페이지로 이동하여, 2단계에서 받은 추가적인 정보와 함께 로그인을 요청한다.
- 페이스북은 사용자에게 로그인 창을 보낸다.
- 사용자는 로그인창에 ID/PASSWORD를 입력한다.
- 페이스북은 사용자를 인증하고, 인증 관련 정보를 브라우저로 전달하면서 My Server Application의 로그인 완료 페이지로 Redirection을 요청한다.
- 6에서 온 인증정보를 My Server Application에 전달한다.
- My Server Application은 이 정보를 가지고, 페이스북에 이 사용자가 제대로 인증을 받은 사용자인지 문의한다.
- 해당 정보를 보고 사용자가 제대로 인증된 사용자임을 확인해주고, API Access Token을 발급한다.
- My Server Application은 9에서 받은 API Access Toekn으로 페이스북 API 서비스에 접근한다.
이 방식은 자사 서비스가 아닌 파트너 서비스에게 자사 서비스 사용자의 인증을 거쳐서 API 접근 권한을 전달하는 방식이다.
대표적인 구현체로 OAuth 2.0이 있다.
※ 이러한 3자 인증 방식은 일반적인 서비스에서는 필요하지 않지만, 자사의 API를 파트너 등 외부 시스템에 제공하면서 사용자의 ID/PASSWORD를 보호하는데 필요한 서비스이기 때문에 API를 외부에 적용하는 경우에는 고려를 해야한다.
'프로그래밍 노트 > WEB' 카테고리의 다른 글
Timeout에 관한 정리 (0) | 2020.03.03 |
---|---|
REST API 보안_인가(Authorization) (0) | 2019.06.07 |
REST API 보안_1 (0) | 2019.05.30 |
REST API 디자인 가이드 (0) | 2019.05.18 |
REST API에 관한 고찰 (0) | 2019.05.18 |