카카오 소셜 로그인을 백엔드 서버와 프론트엔드(앱, 웹) 둘을 사용하는 서비스에서 구현하다보면, 카카오 로그인을 어떻게 구현하고 이들을 어떻게 서버와 잘 교환할지 고민이 생길 수 있다.
카카오 로그인
카카오 소셜 로그인은 타 OAuth와 같은 방식으로 이루어진다.
REST API를 기준으로는 적절히 client_id와 redirect_uri를 포함하여 링크로 요청을 하고, 사용자가 여기서 로그인을 하면 code를 포함하여 redirect_uri로 리다이렉트 된다.
이때 이 code를 적절히 개발자가 받아서 카카오 소셜 서버와의 적절한 통신을 하고 최종적으로 access_token을 받는 방식이다.
앱의 SDK등의 기준으로는 그냥 위의 과정이 SDK에서 적당히 자동으로 처리되고 바로 access token을 받는 방식이다.
문제점
우선 클라이언트에서 전체 카카오 로그인 처리를 완료한다는 가정하에 클라이언트는 access token을 받게 된다. 이때 access token을 자기 자신을 증명하는 용도로 서버로 보내면 서버는 해당 access token을 카카오 인증서버를 통하여 유효한지 확인할 수 있고 이를 통해 사용자 로그인 절차를 거칠 수 있다. 그러나 이때 access token은 탈취되면 안 되는 매우 민감한 데이터이기에 이를 서버로 전송한다면 보안적으로 문제(ssl 미사용 시 더더욱)가 생길 수 있다.
클라이언트와 서버를 연결하기
위와같은 보안 문제를 해결하기 위한 여러 가지 방안을 찾아보았다.
카카오 access_token을 이용하는 방법
access token을 카카오에서 받는것 까지는 클라이언트에서 JDK 등을 사용해서 처리한다. 이후 access token이 아닌 access token을 이용해 얻을 수 있는 유저 고유 id를 서버로 보내는 것이다. id는 서버에서 admin key와 조합하여 카카오 서버로 인증과정을 걸쳐 id가 유효한지 확인할 수 있기 때문이다.
이때 유저 id는 access token을 이용해서 카카오 인증서버의 '사용자 정보 가져오기' 기능을 통해 얻을 수 있다.
이런 방식의 장점은 바로 외부인은 유저 id 자체로는 아무 정보도 알아낼 수 없다는 것이다. 유저 id를 취득하여도 이를 어드민 키등과 조합하여야만 유저 정보를 확인할 수 있기 때문이다. 다만 다르게 말하면 유저 id만으로 인증을 처리한다면, 유저 id를 취득한다면 그 정보 만으로 서비스에 신분을 속이고 로그인할 수 있다는 것이다. 또한 id는 변경되지 않는 값이어서 이것만으로 인증을 처리하기에는 문제가 있어 보인다.
특히 이것이 정상적으로 앱에서 보내온 요청인지 악의적인 조작된 요청인지 구분할 수 없다. 이를 방지하기 위하여 번들ID나 키 해시등의 방법을 이용해서 임의요청을 방지해 줄 수 있다. 이렇게 철저하게 보안적인 조치를 취한다면 id만으로도 인증을 할 수 있을 것 같긴 하나, 그렇다면 오히려 충분히 보안 조치를 취했으니 access token을 이용하면 되는 게 아닌가 싶다.
실제로 여러 인터넷의 글을 보아도 access token을 이용하는 경우가 많고, Django의 allauth등의 라이브러리를 봐도 바로 access token을 전달받는 방식으로 구현되어 있었다.
code를 이용하는 방법
24.02.02 글 추가
SDK가 아닌, REST API를 사용한다면 access_token을 받기전에 code(authorization code)를 받는 절차를 거치는데, 이 code를 서버로 전송하는 방식이 있다. 이 방식의 장점으로써는, code는 한 번만 사용되는 값이고 10분 정도 내에 소멸되기에 더 보안이 높고, 탈취당하더라도 서비스 서버(백엔드)의 client_id 값이 없다면 해당값으로 access_token을 획득할 수 없기 때문에 부담이 덜하다.
이때 서버에서 해당 code로 access_token를 발급받기 위해서는 client_id와 code 획득시 사용한 redirect uri가 필요하기 때문에 redirect uri가 하나로 고정된 환경이 아니라면 해당 uri를 code와 같이 서비스 서버로 보내 인증하는 방식을 사용할 수 있겠다.
레퍼런스
https://devtalk.kakao.com/t/ios/130676/7
https://devtalk.kakao.com/t/sdk/130813
https://kakao-tam.tistory.com/149
https://jundolblog.com/oauth2-0-권한-부여-인증-방식-28acca311b94
'기타 (Other)' 카테고리의 다른 글
LibreChat 사용기 (0) | 2024.05.08 |
---|---|
MacOS 루트 디렉토리 정리 (0) | 2023.08.30 |
소셜 로그인 DB 설계 (0) | 2023.07.30 |
LF vs CRLF (0) | 2023.05.14 |
AWS CodeWhisperer 사용기 (0) | 2023.04.29 |