2021-02-01(Mon)

항목

내용

학습 날짜

2021-02-01(월)

학습 시간

11:00~24:00

학습 범위 및 주제

OAuth, devise, cookie

학습 목표

로그인 기능을 구현하여 이후 모듈기능에서 활용할 수 있도록 한다.

동료 학습 방법

eunhkim, yohlee, sanam, jujeong님과 함께 라이브쉐어로 페어코딩함

상세 학습 내용

우선 주말간 대부분의 공통모듈을 만들었다고 생각했으나 로그인 기능까지 더해져야 비로소 기능 모듈을 나누어 개발할 수 있을 것이라는 판단이 들었다. 각 모듈에서 현재 페이지에 접속한 'current_user'가 누구인지 확인할 수 있어야 그에 맞는 뷰를 보여줄 수 있기 때문이다.

이에 팀원들과 페어코딩을 통해 로그인 기능-소셜 로그인, 2차인증을 구현했다.

로그인

이 과정에서 '로그인' 상태 관리의 3가지 방법을 학습하였다.

  1. 쿠키

  2. 세션

  3. 토큰

devise gem을 쓰면 쉽게 구현할 수 있으나, 서브젝트 요구사항대로 SPA스럽게 애플리케이션을 만들어야한다는 판단하에 직접 로그인/로그아웃 기능을 구현하기로 하였다. devise gem을 쓰면 자연스럽게 로그인/로그아웃 시에 '새로고침'을 하게 되는데, 이는 SPA 스럽지 않다는 것.

결과적으로 각 방법의 장단점을 고려하여 1차 로그인은 쿠키로 구현하였다.

참고

소셜 로그인

소셜 로그인은 42 api의 OAuth 인증을 참고하여 구현하였다.

깃헙 소셜 로그인도 구현했었는데 굳이 필요가 없다는 판단하에 빼버렸다.

참고

2차 인증

2차 인증(two factor authentication)에 대해서 의견이 분분했는데, 2차 인증이 무엇인지에 대해서 먼저 정의해보았다.

2차 인증은 단순히 2번 이상 인증하는 것이 아니라, 인증을 하기 위해서 2~3가지 요소를 조합하여 인증을 확인하는 것을 뜻한다. 이 때 추가적인 요소는 나름대로 표준화된 3가지 요소가 존재한다.

  1. Knowledge Factor(사용자가 알고 있는 것)

    • ex) 비밀번호, PIN(Personal Identification Number), 패턴, 어릴적 별명 등

  2. Possession Factor(사용자가 소유하고 있는 것)

    • ex) OTP tokn, 스마트 카드, 신용카드, 체크카드, 휴대폰으로 SMS 문자 받는 경우 등

  3. Inherence Factor(사용자 고유의 것)

    • ex) 지문, 홍채인식 등

2~3가지 요소를 조합해야한다는 것이 중요하다. 만약 비밀번호를 확인한 다음 어릴적 별명을 입력했을 때 인증해준다면 2차 인증일까? 아니다. 이는 '강한 인증(Strong Authentication)'에 속한다고 할 수는 있겠지만, Knowledge Factor만을 사용하여 인증을 진행했으므로 2차 인증이 아닌 것이다.

이에 우리 팀은 rails의 액션 메일러와 mailgun gem을 활용하여 2차 인증을 구현하였다. 사실 mailgun gem 대신 gmail 계정을 생성하여 구현을 시도해보았으나, 구글 측에서 비정상적인 메일 활용이라고 감지하였는지 몇번 테스트한 것만으로 이메일 계정이 비활성화되는 불상사가 있었다;

  • 참고

    로그아웃

    로그아웃은 쿠키를 초기화하는 식으로 구현되었다. 아래처럼 204 상태코드를 반환하려했으나 오류가 나서 방법을 찾아야했는데, render nothing => true, :status => 204 구문처럼 render를 쓰는 방식은 rails 5 까지만 유효했다는 것을 알아냈다.

      def destroy
        id = cookies.encrypted[:service_id]
        return if not User.exists?(id)
        User.find(id).logout
        remove_session
        render nothing => true, :status => 204
      end

    결과적으로 rails6 이상에서는 컨트롤러에서 204 내용을 보내려면 아래처럼 보내야한다.

    render body: nil, :status => 204

    아니면

    head :no_content

    이렇게 보내면 된다.

학습 내용에 대한 개인적인 총평

상태 관리에 대해서 좀 더 깊게 학습할 수 있어서 좋았다. 다음에는 토큰을 활용한 방식을 시도해봐야겠다.

다음 학습 계획

  • Appearance view 구현

Last updated