100%를 한번에 바꾸는건 어려워도 1%를 100번 바꾸는건 쉽다.

생각정리 자세히보기

나의 일상/생각정리

[생각정리] 생각보다 쉬웠던 오픈소스 기여하기

dc-choi 2022. 9. 3. 01:28
반응형

바쁜 분들은.. 해당 이슈 =>  https://github.com/MasterKale/SimpleWebAuthn/issues/255

 

최근에 FIDO에 관련된 일로 인턴제안을 받았었다. 인턴 제안에 응해서 6월 중순부터 일을 시작하였고, 다행히 FIDO 인증에 어느정도 성과를 보여서 9월 1일자로 정규직으로 전환되었다!

 

최근까지 FIDO 인증을 진행하면서 겪은 좋은 경험을 공유하려고 오랜만에 글을 쓰게 되었다.

 

FIDO? 뭔지는 정확히 모르지만 도전해보자!

처음 제안을 받았던 것은 6월초였다. 당시 이야기를 들을 때만 해도 굉장히 도전적인 일이라고 엄청 겁을 주셨다.

그도 그럴것이 회사에 FIDO를 담당하던 개발자는 이미 퇴사를 한 상황이였다. 그리고 그 개발자도 FIDO에 정확한 스펙은 모르던 것이였다. 즉, 아무도 FIDO에 대한 정확한 스펙을 모르는 상황이였고 그 처음을 내가 담당하게 되었다.

 

사실 신입 개발자가 하기에는 버거운 일이였지만 그럼에도 제안을 받았던 이유는 성과를 확실하게 낼 수 있는 과제라고 생각했고, 당시 나태함에 빠져있던 나 자신에게 새로운 동기부여를 해야했기 때문이였다.

 

그렇게 6월 13일에 인턴으로써 합류하게 되었다.

 

FIDO인증을 위한 LINE FIDO Server 코드 분석

입사 후, 일주일동안 FIDO에 대해서 공부하기 시작했다. 사실 FIDO의 개념조차 잡기 어려웠고, 뭘 어떻게 해야하는지 감도 안왔다. 최대한 https://fidoalliance.org/fido2/의 내용과 https://www.w3.org/TR/webauthn/의 내용을 파악하고자 노력했고, 일주일이라는 시간동안 어느정도 개념을 잡은 후, 본격적으로 이미 FIDO 인증을 받은 LINE FIDO Server(https://github.com/line/line-fido2-server)의 코드를 분석해보려고 했었다.

 

하지만, 방대한 Spring 코드를 혼자서 분석하기에는 큰 어려움이 있었고, 결국 같이 분석하고 개발을 하게 될 새로운 동료를 찾아다니게 되었다. 그래서 정말 능력좋고, 착한 분을 만나서 지금까지 같이 일을 할 수 있게 되었다. 그분이 가지고있는 Spring에 대한 지식과 내가 가지고 있던 FIDO 규격, 그리고 오픈소스로 활용할 https://github.com/MasterKale/SimpleWebAuthn을 서로 비교해가며 FIDO에 대해서 다시 한번 공부를 하게되었다. 그렇게 하여 내린 결론은 SimpleWebAuthn을 사용하면 FIDO 인증을 무사히 마칠 수 있다고 생각했다.

 

SimpleWebAuthn을 이용한 FIDO Server 개발

우리가 전부 다 구현하면 좋지만, 우리에게는 시간이 부족했기에 이 라이브러리를 활용해보기로 하였다. 하지만 이 라이브러리를 활용하면 쉽게 해결이 될 것이라고 생각했지만, FIDO Alliance측에서 제공하는 Test Tool에 통과하지 못하고 있는 상황이였다.

 

그렇게 팀원들끼리 우리가 직접 라이브러리를 고치고 일단 인증을 통과할 것이냐, 아니면 담당자와 컨텍을 시도할 것이냐를 두고 상의하게 되었고 우리의 결론은 담당자와 컨텍을 하게 되는 방향으로 정했다. 운이 좋아서 담당자와 연락이 되어서 발견한 문제점들을 이슈로 남겨달라는 답변을 받았다. 그렇게 되어서 본의아니게(?) 오픈소스에 기여를 할 수 있는 기회가 생겼다. 팀원들 전부 해당 라이브러리에 이슈를 남겼고, 나는 다음과 같은 이슈를 남기게 되었다.

 

WebAuthn의 스펙과 SimpleWebAuthn에서 구현한 내용이 다른 것을 확인하다...

문제가 발생한 부분은 residentKey라는 부분에서 발생하였다. WebAuthn에서는 Level2에 해당하는 인증을 받게 될 경우 residentKey 부분이 추가가 된다. 하지만 우리가 받으려는 FIDO인증은 Level1에 해당하기 때문에 해당 속성이 undefined로 들어오게 된다. 코드를 직접 보여줄 수 없기에 사진으로 SimpleWebAuthn에서 어떤 식으로 구현했는지 설명하려고 한다.

 

If no value is given then the effective value is required if requireResidentKey is true or discouraged if it is false or absent.

SimpleWebAuthn에서는 빨간 줄로 강조한 부분을 지키고 있긴 하다. 하지만 이렇게 될 경우 Level2의 인증밖에 받을 수 없다. FIDO Alliance에서는 Level2 인증을 받기 위해서는 기본적으로 Level1에 해당하는 부분도 지켜져야 한다고 규정하고 있다. 하지만 지금 코드로는 Level1을 통과할 수 없다. residentKey가 무조건 undefined로 들어오기 때문이다. 그렇기에 다음과 같이 변경해야 한다고 이슈에 남겼다.

 

이렇게 되면 Level1에 대한 규칙도 지키면서 Level2도 인증받을 수 있는 코드가 완성이 된다. 더불어 예제 코드까지 같이 작성을 해주어 확실하게 가이드를 해주었다. (실제로는 이렇게 적용된건 아니라서 많이 아쉽다...)

 

그러자, 라이브러리 담당자가 이렇게 응답하였다. (이제 이해했다고 말하는건 부족한 영어실력 때문에.. 하아...)

 

내용을 요약하자면, 내용을 전부 이해했고 이렇게 스펙에 대해서 정확하게 알고 시간내서 대체할 수 있는 가이드를 해줘서 감사하다는 말을 하고있다. 그리고 테스트에 통과하면서 스펙에 맞게 다시 배포를 진행한 것을 확인했다.

 

 

느낀점: 사실 오픈소스라고 하면 막연하게 느껴지고 내가 한 제안이 무시당할 거라고 생각했다. 이슈를 올려도 받아주지 않는 경우가 많다고 하지만, 이 분은 의외로 잘 받아주었다. 내가 제안한 문제점이 라이브러리에 적용이 되었을 때에는 정말 내가 엄청난 일을 해낸거같은 기분이 든다. 정말 좋은 경험을 한 거같아서 기분이 좋다.

반응형