본문 바로가기

비즈

페북, 구글, 네이버, 카카오 소셜 계정 로그인 연동 (REST API)

#0
원래 이런 거 적으면 자세히 적는 편인데 요즈음은 그러고 싶지를 않다. 왜? 어떤 일이 벌어질 지 알기 때문. 분명 소스 코드 덧글로 달면서 내 거 봐달라는 경우 생기겠지. 그래서 내가 이걸 적는 이유는 내가 정리를 하기 위함이고, 혹시라도 개발하는 이들이 있다면 참조할 꺼리를 던져주기 위함에 있지 그 이상도 그 이하도 아니다. 고로 기술적인 질문에 대한 답변은 일체하지 않을 생각이다. 예전에는 친절하지만 까칠했고, 지금은 친절하진 않지만 까칠하지는 않을 생각인지라.

#1
Javascript, PHP

일단 나는 Javascript로 하지 않고 PHP로 구현했다. 왜? 난 Javascript보다는 PHP가 편하니까.

#2
SDK vs REST API

Javascript나 PHP나 대부분 SDK 지원할 거다. 그러나 나는 SDK는 아예 쳐다보지도 않는다. 왜? 내가 원하는 코드만 있으면 모르겠는데 그게 아닐 수 있기 때문에. 그래서 나는 REST API로 내가 코드 넣어서 만들었다. 나는 이런 게 좋다. 물론 나도 부트스트랩을 이용하고는 있지만, 유어오운핏의 CSS는 경량화시켰다. 필요한 거 빼고는 다 정리했던. 정리하는 데에만 며칠 걸렸더라? 나는 그렇게 단순하고 핵심에만 집중한 게 좋다. 그래서 SDK는 선호하지 않는다. 

게다가 더 중요한 거는 처음에 그냥 간단하게 이용하려고 페북 SDK 써볼까 했었는데 이게 PHP 5.4 이상 버전에서 작동하는데 내가 호스팅 받는 서버의 PHP 버전은 그 아래 버전이다. 그래서 안 된다. 맘 편히 REST API 이용하겠다 생각했지.

대부분의 소셜 계정 연동하는 사이트들 소스보기로 봐바라. Javascript로 처리되어 있는 부분이 있을 거다. 그런데 REST API 이용하면 그런 코드가 전혀 안 보일 거다. 링크로 변수를 넘겨주기 때문. 나머지는 그 다음 페이지에서 서버 간에 소켓 통신하면서 처리하거든.

#3
페북, 구글 비슷 / 네이버, 카카오 비슷

해보면 알겠지만 페북이랑 구글이랑은 비슷하다. 또 네이버와 카카오는 비슷하다. 그러나 페북, 구글이랑 네이버 카카오는 좀 다르다. 물론 기본적인 원리는 같은데 구현하는 데에서 네이버와 카카오는 PHP의 경우 CURL 라이브러리를 이용해 소켓 통신 하더라.

#4
통신 단계

1. 일단 code 받아오고
2. 받아온 code로 access token 받아오고
3. 받아온 access token 으로 사용자 정보 가져온다.

code 받아올 때 4개 모두 state라는 변수를 설정할 수 있는데, 보안을 위해서 이거 항상 셋팅해두는 게 좋다. 그러니까 로그인 페이지에서 랜덤한 값을 설정해서 state 변수로 넘겨주면 로그인 처리 페이지로 state 변수 리턴해주기 때문에 서버에서 직접 로그인을 하는 지 여부를 체크할 때 필요하다. 어떤 소셜인지는 모르겠지만 그런 거 얘기 안 하는 도움말을 제공하는 데가 있던데 페북, 구글, 네이버, 카카오 모두 다 state 변수 이용하는 게 좋다.

#5
그런데 이런 거 얘기하려고 적는 거 아니다. 이런 거는 이리 저리 뒤적거리면 많이 나와. 그리고 원리만 정확하게 알면 도움말 보면서도 가능하니까. 그런데 생각보다 도움말이 불편한 경우가 꽤 있다. 내가 블로그에도 적어뒀는지 모르겠다만 나는 구글빠지만 구글의 서비스 중에 가장 맘에 안 드는 게 도움말이거든. 역시나 구글 도움말은 그닥.

#6
중요한 건 로그인이 아니라 로그아웃이다.

로그인 연동보다 중요하다. 왜냐? 보안 때문에. 로그아웃을 그냥 서버에서 세션 종료하는 걸로 끝내면 공용 PC에서 남의 소셜 계정으로 로그인이 되는 거 뿐만 아니라 남의 소셜 계정으로 접속해서 해당 소셜 계정 이용도 가능하다. 이건 심각한 문제다. 그런데 내 확인해본 바, 생각보다 우리나라 사이트 로그아웃 제대로 구현하는 데에 많지 않다. 문제라 할 수 있는 부분. 근데 웃긴 건 페북, 구글, 네이버, 카카오에서도 이에 대해서는 그닥 중요하게 언급하지 않는 듯.

개인정보처리방침은 폼으로 작성하는 모양이다. 거 템플릿화된 거 가져와서 부분 부분 자기네들 회사 이름만 바꿔서 만들었나? 말만 번지르르한 데가 많은 듯.

#7
로그아웃

유어오운핏 사이트에 접속해서 로그아웃을 할 때는 로그아웃 옵션이 뜬다. 유어오운핏에서만 로그아웃할래? 아니면 연결된 소셜 계정까지 로그아웃할래? 개인 PC에서 이용하는 거라면 유어오운핏에서만 로그아웃(이게 디폴트) 하는 게 낫다. 예를 들어 구글 계정으로 로그인을 했으면 유어오운핏은 로그아웃했어도 구글은 로그아웃을 한 게 아니니 구글 서비스는 내 계정으로 계속 이용 가능한 거지. 그러나 공용 PC라면 둘 다 로그아웃을 할 필요가 있다. 그러나 이런 거를 업체의 사이트에서 지원해주지 않으면 유어오운핏에서 로그아웃한 다음에 해당 소셜 계정에 가서 다시 로그아웃을 해야 하는 거다. 그래서 유어오운핏은 로그아웃에 옵션이 있는 거라는 거.

1. 우선 페북은 깔끔하다. 왜 그런가 가만히 생각해보면 페북은 그만큼 서비스가 나머지 세 개보다는 단순해서 그럴 수 있다고 본다. 도움말 참조해서 하면 내 사이트 세션 종료와 함께 페북 세션도 종료 처리 가능하다. 어렵지 않다.

2. 구글은 로그아웃에 대한 도움말 자체가 지원 안 되는 걸로 기억한다. 구현하고 바로 정리하는 게 아니라 내 기억으로는 그렇다. 헐. 그래서 편법을 이용해서 처리했다. 내 항상 얘기하지만 나는 구글빠지만 유일하게 도움말은 정말 맘에 안 든다.

3. 네이버는 아예 지원 자체를 안 한다. 그래서 문서에 그런 얘기도 없다. 앱 연결 해제는 쉽게 얘기해서 탈퇴할 때 사용하는 거고 로그아웃과 같은 현재 연결된 세션 종료에 대한 얘기는 어디에도 없다. 그래서 편법으로 구현했다. 거 참. 삽질했네 그려.

4. 카카오는 도움말에는 깔끔하게 정리되어 있다. 그러나 그렇게 해봐라. 로그아웃 안 된다. 그러니까 유어오운핏에서 로그아웃하면서 카카오에서도 로그아웃하는 걸로 처리했는데(유어오운핏은 본인이 그걸 선택할 수 있으니 그렇게 로그아웃하라고 선택했는데) 실제로 유어오운핏은 로그아웃되었지만 카카오는 로그아웃 안 되어 있다. 이게 카카오는 계정 연동해서 로그인할 때 별도의 캐쉬 설정을 해서 그런 듯 싶다.

이런 문제를 어떻게 확인하냐면, 소셜 계정까지 로그아웃을 한 상태에서 다시 로그인을 하면 로그인 창이 떠서 내가 해당 계정의 패스워드를 입력해야 로그인이 된다. 그렇지 않고 바로 로그인 처리가 되면 해당 소셜 계정은 로그아웃이 안 된 상태라는 게지. 그렇게 되는 거다. 카카오 문서에는 이렇게 처리하면 로그아웃된다고는 되어 있는데 기실 그렇지가 않다. 처리되기는 한다. 해보니 access token이 다르다. 그러나 그렇다고 해서 카카오 계정에서 로그아웃되는 건 아니라는 얘기지.

그래서 이것도 아이디어를 내서 편법으로 처리했다.

#8
내 이거 하면서 느낀 점은 뭐 개인정보보호가 중요하다 별 지랄을 해도 기실 별로 중요하게 생각치 않는 모양이다. 그에 대한 자세한 내용을 제공하지도 않고. 아주 지랄같더라. 역시 돈 안 되는 거에는 별로 신경을 안 쓰는 듯. 어차피 해킹되어 개인정보 유출되도 뭐 별 문제 없이 지나가니까. 말만 번지르르하게 우리는 개인정보 관리를 엄격히 한다고 하겠지.