안전한 비밀번호 처리(Ruby on Rails)

프로그래밍 공부 일기



2020년 7월 25일 Progate Lv.223
Ruby on RailsⅩⅠ

개요



지금까지 작성한 앱은 패스워드가 보통의 문자열로서 보존되어 있다. 이것으로 PC의 엿보기나 해킹되어 데이터가 도난당한 경우에 그 비밀번호를 사용하여 쉽게 타인의 계정에 부정 로그인할 수 있다.

 →안전성이 높은 패스워드는 만일 들여다보거나 데이터가 도난당해도 패스워드의 내용을 모르는 상태이다. 암호를 복잡한 문자열(암호화된 특수 문자열)으로 함으로써 안전성을 높일 수 있다.

Gemfile 편집



Rails로 패스워드를 암호화할 때는 gem(읽는 방법: 「젬」)이라고 하는 툴을 이용한다. gem은 Ruby나 Rails로 프로그래밍을 할 때 "자주 사용하는 기능"을 패키지화한 것이다. 다양한 gem이 존재하지만, 이번은 bcrypt 라고 하는 암호화하기 위한 gem을 사용한다.
Rails에는 설치하고 싶은 gem을 기술하는 Gemfile이라는 파일이 존재한다. gem 'gemの名前' 라고 기술한다. rails new 명령으로 생성 된 Gemfile에는 이미 일부 gem이 작성되어 설치되어 있습니다.gem 'gemの名前', 'gemのバージョン' 라고 하면(자), 그 버젼이 인스톨 된다. 버전을 지정하지 않으면 최신 gem이 설치됩니다.

Gemfile
gem 'rails', '5.0.3'
gem 'puma', '3.6.2'

bcryptのインストール
gem 'bcrypt'

터미널
$ bundle install

암호화


  • bcrypt를 설치하면 has_secure_password라는 메서드를 사용할 수 있습니다. 암호를 처리하는 User 모델에 has_secure_password를 추가합니다. 이제 사용자를 저장할 때 자동으로 암호를 암호화합니다.

  • user.rb
    class User < ApplicationRecord
      has_secure_password
    end
    
    has_secure_password는 password가 존재하는지 자동적으로 체크한다.
  • passwor_digest 열을 추가합니다. has_secure_password 메서드는 암호화 된 암호를 passwor_digest 열에 저장합니다. rails generate migration 명령으로 마이그레이션 파일을 작성하고 passwor_digest 열이 추가되도록 편집하십시오. 그런 다음 password 열이 삭제되도록 편집합니다. 컬럼의 삭제는 remove_column를 사용한다. 하나의 마이그레이션 파일로 여러 열을 변경할 수 있습니다.

  • 터미널
    $ rails generate migration change_users_columns
     マイグレーションファイル変更後
    $ rails db:migrate
    

    2020~_change_users_columns.rb
    class ChangeUsersColumns < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :password_digest, :string
        remove_column :users, :password, :string
      end
    end
    
  • password_digest 컬럼에 암호화 된 패스워드를 보관 유지하기 위해서는 지금까지대로 password에 값을 대입한다. 이제 has_secure_passwordpassword에 할당 된 값을 암호화하고 password_digest 열에 저장합니다. 그래서 이미 있다 password 에 관한 코드는 변경하지 않아도 된다.

  • 암호화된 비밀번호로 로그인



    폼에 입력된 메일 주소와 일치하는 사용자를 취득하고, 폼에 입력된 패스워드와 취득한 사용자의 패스워드가 일치하는지를 판정한다. has_secure_password 메서드를 활성화하면 authenticate 메서드를 사용할 수 있습니다. authenticate는 전달 된 인수를 암호화하고 password_digest의 값과 일치하는지 여부를 결정합니다. authenticate 메소드를 사용해, 「송신된 메일 주소와 일치하는 유저」의 password_digest와 송신된 패스워드가 일치하는지 어떤지로 로그인 처리를 한다.



    users_controller.rb
    def login
      @user = User.find_by(email: params[:email])
      if @user && @user.authenticate(params[:password])
    
    

    좋은 웹페이지 즐겨찾기