2021-02-10(Wed)

항목

내용

학습 날짜

2021-02-10(수)

학습 시간

11:00~24:00

학습 범위 및 주제

Active Admin gem, BCrypt gem, Rails Active Record, Backbone

학습 목표

Signup 모듈을 구현완료한다.

동료 학습 방법

eunhkim, sanam, jujeong님과 페어프로그래밍

상세 학습 내용

Active admin으로 리소스를 추가하여 테스트에 활용하는 방법을 학습했다.

rails generate active_admin:resource ChatBan

위 명령어로 active_admin을 활용하면 된다.

그리고 Password를 암호화해서 DB에 저장하기 위해 BCrypt를 활용했다. 아래는 내가 정리한 BCrypt 활용 플로우.

BCrypt는 단방향으로 복호화가 불가능하도록 설계되었습니다. 따라서 해싱 후 데이터를 저장하게 되면 데이터를 보더라도 원본 값을 알 수 없습니다. 덕분에 개발자가 나쁜 마음을 먹고 특정 유저의 Password 레코드를 뜯어본다고 해도 복호화된 원본 Password를 알 수 없게 되는 것이죠.

그럼 유저가 Password를 입력했을 경우 맞는 Password인지 여부는 어떻게 확인하느냐! 
DB에 저장해뒀던 '디지털 핑거프린트'로 BCrypt::Password Object를 생성한 후 == 연산자로 비교하면 BCrypt::Password Object의 내부 해시 알고리즘을 통해  해당 password가 맞는지 검증합니다.

결과적으로 회원가입/로그인 암호 처리는 아래 과정으로 이뤄집니다.

1. 회원가입시 입력한 password는 BCrypt::Password.create 메서드에 인자로 넘겨지고, BCrypt::Password Object가 만들어진다.
2. 이 BCrypt::Password Object의 'Digital fingerprint'를 String으로 DB에 저장한다.
3. 이후 로그인시 유저가 Password를 입력하면, 해당 유저의 DB Password 필드에 저장해뒀던 'Digital fingerprint'를 불러온다. 이를 BCrypt::Password.new 메서드의 인자로 넘겨 BCrypt::Password Object를 생성하며, 이 Object에 유저가 입력한 Password를 전달하여 해시검증하도록 한다.

참고 1 참고 2

문제)

버튼을 여러번 누르면 이벤트가 여러번 트리거 되어버리며 Appearance View에 로그인한 유저가 여러명 생겨버린다. 이걸 어떻게 해결할 것인가?

해결)

방법을 확인해보니 일종의 flag를 만들어서 처리하는 것이 구현도 용이하고 일반적인 것이라 판단했다.

button을 가지고 있는 view 객체에 status 어트리뷰트를 만들었다. 이후 버튼 클릭 시점의 status 어트리뷰트 값을 조사해서 동작할 액션을 결정하고, 곧바로 status 값을 수정해주는 식으로 해결했다.

Rails 테크닉 한 토막

연관 테이블 검색시 자기 자신을 참조하고 싶다면?

특정 유저와 그 유저의 친구들에 대한 정보를 불러와야했다. 아래처럼 명시해주면 된다.

class Friendship < ApplicationRecord
  belongs_to :user
  belongs_to :friend, class_name: "User", foreign_key: "friend_id"
end
class User < ApplicationRecord
  has_many :friendships
  has_many :friends, through: :friendships, source: :friend
  ...
end

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

페어프로그래밍을 적극 활용하고 있는만큼 커밋 로그에 내 이름을 남기기는 쉽지 않으나, 동료로부터 배우는 점이 많아서 좋다. 곧 설연휴다. 프로젝트 모듈 참여가 어려워지더라도 프로젝트 진행에 필요한 책을 읽는 식으로 어떻게든 학습을 멈추지 말자.

다음 학습 계획

  • 루비로 배우는 객체지향 디자인 챕터 3 읽기

  • 프로젝트 모듈 참여는 미정

Last updated