Rails/Ruby에 마법이 너무 많다는 말을 들어보셨을 수도 있습니다.
- 그런데 그 아이디어는 어디서 나온 거죠?
- Rails의 마법이란 정확히 무엇인가요?
- 그리고 그 마법을 없애기 위해 무엇을 할 수 있나요?
내 생각은 이렇다 :
무언가가 마술처럼 느껴질 때 그것은 당신이 모르는 무언가가 있기 때문에 일부 정보가 빠져 있기 때문입니다.
마치 마술처럼 비법을 알면 마술은 없다 .
소프트웨어 개발에서 트릭을 아는 것은 실제로 작동하는 방식을 이해하는 것과 같습니다. .
예시를 보자!
이 예는 BCrypt
에 관한 것입니다. , 암호를 안전하게 저장하는 데 사용되는 해싱 알고리즘입니다. bcrypt
를 통해 Ruby에서 구현됩니다. 보석.
BCrypt
를 사용하는 방법은 다음과 같습니다. "testing"이라는 단어를 해시하려면:
'bcrypt'BCrypt::Password.create("testing")# "$2a$10$3o.xrISG8fqKfzKqDpgKn.3cwjFV//9C9cZ7MuK5S9sNKFBivB7YG"BCrypt::Password.create($2a) 필요 매번 다른 해시를 얻는 방법에 주목하세요. 그러나 MD5(사용하지 마세요!) 또는 SHA1과 같은 것을 사용하면 주어진 문자열에 대해 항상 동일한 출력을 얻을 수 있습니다.왜
BCrypt
입니까? 다른 방식으로 행동합니까?무슨 일이 일어나고 있는지 잠시 후에 설명하겠지만 먼저 두 bcrypt를 비교하는 방법을 살펴보겠습니다. 해시, 하나는 데이터베이스에서, 하나는 사용자 입력에서 가져옵니다(예:양식 또는 이와 유사한 것).
BCrypt::Password.new(@user.hash) ==params[:password]# true왼쪽 부분(
BCrypt::Password.new
)은BCrypt
입니다. 데이터베이스에 저장된 해시를 매개변수로 사용하는 개체입니다.오른쪽 부분(
params[:password]
)은 사용자가 로그인하려는 일반 텍스트 암호입니다.이 경우 올바른 사용자/비밀번호 조합이 사용되고 있다고 가정합니다.
그렇다면 이것이
true
로 평가되는 이유는 무엇입니까? ?이를 이해하려면 다음 두 가지를 알아야 합니다.
- BCrypt는 보안을 강화하기 위해 사용되는 임의의 값인 "소금"이라는 것을 사용합니다. 미리 계산된 해시에 대해 소금은 해시 자체에 저장됩니다.
- Ruby에서는 구문처럼 보이는 많은 것들이 단지 메소드일 뿐입니다. . 이중 등호 연산자(
==
).그것을 알면
BCrypt
자체==
정의 비밀번호를 비교할 때 이를 고려할 수 있도록 해당 "소금" 값을 추출하는 방법을 알고 있는 메소드입니다.즉 :
BCrypt#==
저장된 해시에서 "소금" 값을 가져옵니다.그런 다음 이 솔트를 사용하여 일반 텍스트 암호(사용자 입력)를 해시하므로 암호가 유효한 경우 두 해시가 동일합니다.
소스 코드를 살펴보려면 다음과 같이 보일 것입니다:
def ==(비밀) 슈퍼( BCrypt::Engine.hash_secret(비밀, @salt) )end
super
동일한 메소드를 호출합니다(이 경우==
) 상위 클래스에서.
BCrypt::Password
의 상위 클래스String
입니다. .방법에 관한 모든 것
이해해야 할 한 가지 중요한 점은 몇 가지 키워드와 몇 가지 구문 요소(예:괄호) 외에는 모두 클래스와 메서드에 관한 것입니다.
작업 중인 클래스를 알고 있는 경우(
class
를 사용하여 확인할 수 있습니다. 방법) 어떤 작업(방법)을 사용할 수 있는지 항상 알 수 있습니다.그러나 때때로 우리는 객체 없이 메소드를 호출합니다.
이것은 종종 메서드가 현재 클래스에 정의되어 있음을 의미하지만 항상 그런 것은 아닙니다.
예 :
123개
puts
은(는) 어디에 있습니까? 한정된? 알아보자:method(:puts).owner# 커널혼란스러울 수 있는 또 다른 사항은 메타프로그래밍입니다. 메타프로그래밍을 사용하면 프로그램 실행 중에 메서드를 생성, 수정 또는 제거할 수 있기 때문입니다. 이러한 것들은 코드를 더 불투명하고 모호하게 만듭니다.
사용 가능한 메타프로그래밍 방법과 작동 방식을 알고 있으면 혼란을 줄일 수 있습니다.
요약
작동 방식에 대한 깊은 이해가 "마법"을 없애고, 더 나은 코드를 작성하고, 더 나은 개발자로 만드는 데 어떻게 도움이 되는지 배웠습니다.
Ruby 기술을 향상시키려면 기본과 고급 개념 간의 격차를 해소하도록 설계된 내 책 Ruby Deep Dive를 확인하세요. 🙂