요즘은 서비스를 개발하면 트위터나 페이스북 같은 SNS로 인증을 하거나 연결을 하는 경우가 많이 있습니다. 요즘 인증은 대부분 OAuth가 대세가 되기는 했지만 버전도 여러가지 있고 각 서비스마다 약간의 차이들도 있기 때문에 구현하려면 까다롭고 각 서비스마다 문서를 참조해야하는 불편함이 있습니다. 저도 개인프로젝트에서 SNS 인증을 사용하고 있는데 node.js에는 everyauth라는 인증모듈이 존재합니다. 통일된 방법으로 설정만으로 수많은 서비스의 인증을 연동할 수 있어서 everyauth를 사용하고 있었습니다.
그러다가 작년 말쯤에 passport라는 새로운 인증모듈이 나온것을 알게 되었습니다. 그냥 기존에 사용하던게 있었으므로 쓰고 있다가 이번에 passport로 갈아탔습니다. everyauth는 비동기를 위해서 Promise방식을 사용하고 있었는데 저는 Promise방식에는 익숙치 않은데다가 여러가지로 좀 번잡스럽다고 느껴졌기 때문에 교체를 고민하다고 stackoverflow에 올라온 질문에 passport를 만든 Jared Hanson이 직접 답변한 내용을 보고 수긍이 가는 부분이 꽤 있어서 everyauth를 걷어내고 passport로 갈아탔습니다. passport는 아주 간단하게 사용할 수 있는데 자세한 설명은 여기선 생략합니다.
passport용 me2day 인증 전략
passport를 사용해서 필요한 인증을 가져다 붙혔는데 안타깝게도 국내 서비스인 미투데이에 대한 인증모듈은 없었습니다.(어찌 보면 당연한 얘기죠.) 국내에서는 미투데이도 무시하기는 어렵다고 생각하기도 했고(everyauth용으로도 만들까 했었는데 생각보다 복잡해서 나중작업으로 미뤄뒀었습니다.) passport가 전략패턴을 사용하고 있기 때문에 새로운 인증을 추가하는게 그리 어렵지는 않을 것 같아서 미투데이용을 만들기 시작했습니다.
기존에 올라온 passport의 전략들의 소스를 여러개 받아서 살펴보면서 미투데이용으로 변환하기 시작했습니다. 구조가 아주 복잡하지는 않았지만 대부분의 전략들은 OAuth를 사용하고 있어서 생각처럼 간단히 변환되지는 않았습니다. 예를 들어 passport-twitter도 내부적으로는 다시 passport-oauth를 사용하고 있었습니다. 대부분의 서비스가 OAuth를 사용하기 때문에 passport-oauth를 오버라이드하는 구조일 뿐이기 때문에 다른 전략들에서 인증부분만 미투데이용으로 살짝 바꾸려했던 것이 잘 안되서 여러 전략을 참고해서 작성을 해야했습니다.
미투데이는 OAuth와 비슷하지만 약간은 다르기 때문에 미투데이 가이드를 보면서 작성을 해야했습니다. 사실 이런 모듈은 TDD로 하는게 좋다고 생각은 하지만 인증은 TDD를 짜기가 좀처럼 어려워서 직접 소스를 짰고 나중에 테스트를 추가하려다가 포기를 했습니다. 테스트코드에서 직접 미투데이를 호출하는 건 좀 아닌것 같고 목킹을 하자니 테스트의 의미가 퇴색되는 것 같아서 결국 테스트코드는 제거해 버렸습니다.(나중에 업데이트때 넣던가 하죠... ㅎ) 그래도 예제는 포함시켰으니 간이 테스트는 된다고 위안을 했습니다.
그래서 만들어진게 passport-me2day이고 저장소는 Github에 있습니다. 여러 상황에서 오류가 있을 수도 있지만 일단 기본적인 인증을 잘 동작하고 있습니다.(사실 분석하느라 오래걸려서 그렇지 코드도 별게 없습니다.) 어쨌든 저한테는 처음 배포해본 npm 모듈이군요. Jared Hanson한테 요청을 보내서 passport 페이지에도 추가해 달라고 해야겠습니다. npm 저장소에 배포된 걸 보니까 별거 아님에도 왠지 기분이 좋군요.
사용방법은 다른 전략들과 크게 다르지 않고 README 문서에 적어놨으므로 생략합니다.
Comments