소셜 로그인, JWT 연관 의문점 정리
사실 이 서비스를 쓸 바에 slack이나 discord에 webhook을 걸어버리면 훨씬 여러 기능을 지원받을 수 있어요. 그럼에도 왜 이런 기능을 개발했는가. 팀원이 디스코드나 슬랙을 자주 확인할 것 같지 않았기 때문입니다. 아무래도 프로젝트 경험이 적거나, 학부생이라면 해당 서비스에 대한 친숙도가 적을 것이고 그만큼 자주 확인하지 않게 되므로, 결국 메신저로 확인 문자를 주고 받게 될 것입니다. 그러다. 문득 이럴 바엔 그냥 카카오톡으로 바로 메모를 주면 되지 않을까요?라는 생각이 스쳐 지나갔고 이런 서비스를 구현하게 되었습니다.
하면서 포기할까, 자신이 이딴 걸 왜 만들고 있지 싶다가도 재밌어서 끝까지 만들게 되었습니다. 원래 사용하면 되지 않을까 했는데, access token이 만료될 때마다. 자신이 수동으로 갱신해주시기 바랍니다야 하는 시스템이길래 바로 갖다. 버렸다.
시행 착오
1 카카오 OAuth 인증을 위한 여정
자신이 만드는 건 백그라운드에서 동작하는 node.js 애플리케이션이므로, 지금처럼 다정하게 카카오 로그인 페이지를 볼 수 있는 환경이 아닙니다. 초기에는 로그인 url만 따와서 아이디와 패스워드 정보를 보내주면 되지 않을까 했는데, 얘네 무슨 packet으로 보낼 때부터 암호화를 하고 있었습니다. 그러면 방법은 크롤링을 해서 id, pw를 주입한 다음 로그인 버튼을 누르는 매크로 기능을 구현해야 했는데, 여기서부터가 악의 근원이었다.
uppeteer 라이브러리를 끌고 와서 어찌저찌 로그인을 시켜줬더니 2차 인증을 해주시기 바랍니다야 한다고 합니다. 이걸 범용적인 CI로 만들려면, 2차 인증 설정이 되어 있느냐 아니냐에 따라 또 분기를 나눠야 합니다.
이렇게 프론트와 서버의 역할을 구분지으면 되겠습니다. . . 라고 생각했지만
안드로이드를 위한 SDK가 존재해 소셜 로그인까지 마친 후 서버에 토큰을 전달하는 방식으로 구현할 수 있었다!자세한 정보 따라서 이번 프로젝트에서는 소셜 로그인을 안드로이드 sdk를 이용하여 서버는 해당 토큰으로 유저의 정보를 불러와 DB에 저장하고 앱 내의 Refresh Token, Access Token을 반환해 주는 방식으로 구현하고자 한다 안드로이드 sdk를 이용했을 때 보안상 취약점이 있을지는 한 번 더 찾아봐야겠다.
버그의 발생
RedisManager의 멤버인 mutex로 Task 큐에 접근할 때 Lock을 거는 과정에서 서버의 크래시가 일어나는 버그가 발생하였습니다. 하지만 아무리 중단점을 호출 스택을 타고 올라가며 분석을 해보아도 어떤 것이 문제인지 알 수 없었습니다. 호출 스택을 분석해보아도 문제가 될 여지가 있는 코드는 보이지 않았습니다. 하지만 해당 코드 아래의 Task의 큐의 값을 연구하는 코드에서 Task 큐의 메모리를 본 결과 알 수 없는 값으로 채워져있는 것을 볼 수 있었습니다.
이로써 RedisManager의 초기화 과정에서 문제가 있었음을 확인하려 RedisManager를 초기화하고 Redis 스레드를 실행시키는 멤버 함수인 Run 함수를 확인해보았는데도 문제가 없었습니다. 여기서 아차 싶었다.
설계와 구현
먼저 RedisTask를 정의하고 시작하겠습니다. RedisTask 또한 어떤 작업인지 구분할 RedisTaskID가 필요합니다. enum class RedisTaskID UINT16INVALID 0,REQUESTLOGIN 1001,RESPONSELOGIN 1002,
여기서 중요한 것은 ID의 값이 PacketID와 중복하지 않도록 하는 것입니다. PacketID 값은 3자리 수, RedisTaskID의 값은 4자리 수로 지정하여 서로 충돌하지 않도록 만들어주었다.
중복되지 않도록 만들어 주는 것은 Packet 스레드에서 결과를 처리하게 될 때 ID 값을 서치하여 함수 포인터를 사용하여 적절한 함수를 사용하도록 해야하는데 이것을 같은 map 자료구조 안에 담겨있도록 만들었기 때문입니다.
그래도 나름 고생한 만큼 잘 써먹고 있습니다. 특히 git push 할 때마다. 메신저로 공지 뜨는 거 보시면 흐뭇함 그 자체. 그러나 개선해야 할 사항이 너무너무너무 많아서, 차마 오픈 소스로 올리기엔 한계점이 명확하다는 게 단점입니다. 이런 단점에도 불구하고, 아무도 만들지 않은 나만의 프로젝트에 적용하기 위한 기능을 만들어 볼 수 있어서 너무 즐거웠던 경험이었다. 메모를 보내는 주체는 나에게 메시지 전송으로 카톡이 와서 알림이 안 뜹니다.
난 어차피 Github 자주 확인해서 딱히 불편함을 못 느꼈습니다. ) runner로 등록된 모든 PC에 ”나” 계정으로 로그인 하여 기기 인증을 모두 수행해주시기 바랍니다야 합니다. (보안 취약점) 2차 보안 인증 걸 수 없습니다.. (보안 취약점) 크롬 설치가 생각보다. 오래 걸려서 action 한 사이클 도는데 거의 3분이 소요됩니다. 너무 느리다.
자주 묻는 질문
시행 착오
1 카카오 OAuth 인증을 위한 여정자신이 만드는 건 백그라운드에서 동작하는 node. 좀 더 자세한 사항은 본문을 참고해 주세요.
이렇게 프론트와 서버의 역할을 구분지으면 되겠습니다. . . 라고
안드로이드를 위한 SDK가 존재해 소셜 로그인까지 마친 후 서버에 토큰을 전달하는 방식으로 구현할 수 있었다자세한 정보 따라서 이번 프로젝트에서는 소셜 로그인을 안드로이드 sdk를 이용하여 서버는 해당 토큰으로 유저의 정보를 불러와 DB에 저장하고 앱 내의 Refresh Token, Access Token을 반환해 주는 방식으로 구현하고자 한다 안드로이드 sdk를 이용했을 때 보안상 취약점이 있을지는 한 번 더 찾아봐야겠다. 좀 더 자세한 사항은 본문을 참고해 주세요.
버그의 발생
RedisManager의 멤버인 mutex로 Task 큐에 접근할 때 Lock을 거는 과정에서 서버의 크래시가 일어나는 버그가 발생하였습니다. 좀 더 자세한 사항은 본문을 참고해 주세요.