[인증/인가] #8. 인증과 인가

김상웅·2022년 6월 13일
0

[Computer Science]

목록 보기
8/10

✅ 들어가면서


배포된 많은 웹서비스를 이용할 때 내가 누구인지 알려주어야 할 때가 있을 것입니다.

그 웹에 회원가입을 하는 방식이 있을 수도 있고, 카카오나 구글계정을 통해 로그인을 할 수 있습니다.

인증은 로그인입니다. 내가 누구입니다! 라고 확인하는 절차입니다.
인가는 확인된 누군가가 특정 권한이 있는 유저인지 확인하는 절차입니다.



📌 인가와 인증이 필요한 이유

웹서버를 개발하고 배포하는 개발자의 입장에서 다음과 같은 이유를 들 수 있겠습니다.

우리의 서버를 누가 이용하고 있는가?
  • 어떤 회원이 우리 서비스를 이용하고 있는지 파악할 수 있습니다.

  • 특정 회원에게 특정 데이터를 저장하고, 요청에 의해 그 데이터만 응답해줄 필요가 있습니다.


📌 인가와 인증.. 어떻게 하는 것이지?

우리가 특정 서비스를 이용하기 전에 회원가입을 하고 로그인을 하는 과정을 생각해봅시다.

사용자는 서버에게 아이디 패스워드 등 회원 정보를 알려줄 것입니다.

여기서 가장 중요한 정보는 바로 패스워드입니다.

회원을 구분하고, 외부의 해킹 공격을 최대한 막아주는 역할을 패스워드가 맡고 있습니다.

📌 비밀번호 관리 방법

우리는 회원을 특정짓고, 그 회원의 정보를 보관하기 위해 패스워드, 즉 비밀번호를 통해 인증과 인가라는 절차를 진행합니다.

하지만,
회원의 비밀번호를 그대로 저장하는 경우 큰 보안문제를 야기할 수 있습니다.

이런 문제를 방지하기 위해 비밀번호를 암호화하는 것을 법으로 강제하고 있는데요.

개인정보보호법에서 암호화에 대해 규정하고 있는 사항을 간단하게 알아보겠습니다.

가장 중요시 하는 부분은 암호화라는 보안기술입니다.

해커의 공격이 닿을 수 없거나, 해커의 공격으로 유출되어도 문제가 발생하지 않는 정보가 아닌 경우

서비스를 배포해야 하는 개발자는 국가 상용 암호화 알고리즘을 이용하여 사용자의 개인정보를 암호화하도록 규정하고 있습니다.



✅ 암호화


알아볼 수 없는 코드로 변경시킨다..

해싱 개인정보에서 가장 중요한 패스워드를 복잡한 다른 문자열로 대체하는 것을 가리킵니다.

아래는 암호화 예시를 보여주는 사진입니다:

위 사진에서 볼 수 있듯 password field의 데이터들이 알아볼 수 없도록 이상한 문자열로 구성되어 있습니다.

데이터베이스 상에서만 변경된 문자열로 저장을 하고, 사용자는 본인이 기억하는 비밀번호로 로그인할 수 있습니다.

📌 해시 (단방향 해시)

앞서 해싱이라는 단어를 사용했는데요.

암호화를 하는 방법 중 하나로 해시 함수(HASH function)이라는 것이 있습니다.

일정 데이터를 고정된 길이의 데이터로 매핑하는 함수를 말합니다.

이 해시 함수에 의해 얻어지는 값, 위의 데이터베이스 테이블의 password field의 데이터 값을 해시 값이라고 부릅니다.

해시 함수는 동일한 값에 대해 동일한 해시 값을 반환하는데요.

이런 문제점을 보완하기 위해 개인정보를 암호화하기 위해서는 단방향 해시를 통해 복호화 (암호화 이전의 값으로 접근하는 것)를 제한합니다.

하지만 같은 데이터가 같은 해시값을 가리키는 허점을 노려 해시 함수가 반환하는 해시값의 경우의 수를 만드는 Rainbow Table와 같은 서비스도 존재한다고 합니다.

📌 https

암호화를 뒷단 (Back-end)에서만 필요로 하지 않습니다.

개인정보를 전달하는 주체는 클라이언트, 즉 프론트엔드입니다.

따라서 클라이언트에서도 데이터를 전송할 때 보안 문제에 신경을 써주어야 하는데요.

그 방식을 https라고 부릅니다.

클라이언트 => ssl(https) => 서버 => 암호화 => DB저장

개발 단계에서는 독립적인 네트워크를 사용하기 때문에 크게 신경을 쓸 필요가 없습니다.

하지만 다양한 사용자를 만나야하는 실제 배포단계에서 필요한 부분이라고 할 수 있겠네요.

📌 Salting & KeyStretching

Salting = 소금을 쳐버려

해시값은 해킹에 쉽게 노출되기 쉽기 때문에 등장한 보완 방식입니다.

입력한 비밀번호에 임의로 생성한 문자열 = salt를 합쳐 새로운 해시값을 생성해 저장하는 방식입니다.

KeyStretching = 키에 키를 물어 늘어져버려

해커가 Salting 방식을 사용하여 저장한 데이터를 반드시 얻어야 한다면 오랜 시간을 통해서라도 해킹을 시도할 것입니다.

개발자는 이 시간을 더욱 늘리고, 해커를 포기시키기 위해 keyStretching 방식을 사용하기도 하는데요.

SaltingHasing을 여러번 반복하는 과정을 가리킵니다.



✅ bcrpyt


앞서 언급한 Salting & KeyStretching의 대표적인 라이브러리 중 하나입니다.

  • 다양한 언어를 지원하고 있으며, 사용이 간편하여 쉽게 적용할 수 있습니다.

  • bcrypt는 해시 결과 값에 salting값과 hashing값 및 반복횟수를 같이 보관합니다.
    그렇기 때문에 데이터베이스 설계를 복잡하게 할 필요가 없게 됩니다.

bcrypt를 통해 해싱된 결과 값의 구조는 아래와 같습니다:



✅ 인가 (Authorization)


유저의 권한을 확인하는 절차입니다.

HTTP 특징 중 하나는 Stateless라고 배운 적이 있습니다.
이전의 통신 결과를 저장하지 않는다는 것이 특징입니다.

Stateless 특징을 해결하지 못하면 사용자는 웹을 이용할 때마다, 서비스를 이용할 때마다 로그인을 해야할 것입니다.

📌 JWT

JSON Web Token의 약자로, 인증에 필요한 암호화된 정보를 가리킵니다.

토큰이라고 부르는 대부분이 JWT를 의미하고 JWT는 긴 문자열로 구성되어 있습니다.

인증/인가 단계에서 JWT를 통해 위의 Stateless 특징에서 발생하는 문제점을 보완할 수 있는데요.

클라이언트의 가장 첫번째 요청, 즉 로그인을 할 때 사용자에게 JWT(토큰)을 발행하게 됩니다.

이후 두번째 요청부터 이 토큰을 headers의 메타데이터에 담아 서버에게 요청을 하는데요.

서버에서는 이 토큰이 내 서버에서 발행한 것인지 아닌지를 판단하는 인가 절차를 거치게 됩니다.

📌JWT구조

jwt 문서보기

  • 헤더 headers에는 다음 정보가 포함됩니다. (인코딩 부분 >> 개인정보 ❌)

    • 토큰의 타입 typ
    • 해시 알고리즘 정보 alg
    • 예시 {"alg": "HS256", "typ": "JWT"}
  • 내용 payload에는 다음 정보가 포함됩니다. (인코딩 부분 >> 개인정보 ❌)

    • 미리 정의된 집합 Resgistered Claim - exp(만료시간)
    • 공개용 정보 전달 내용 Public Claim
    • 클라이언트와 서버의 협의 내용 Private Claim
    • 예시 {"user-id": 1, "exp": 1539517391}
  • 서명 signature에는 다음 정보가 포함됩니다. (복호화 부분)

    • SECRET_KEY첫번째 요청에서 발한JWT`가 해당 서버에서 발행된 것인지 확인할 때 사용합니다.

      1. 클라이언트가 서버로 전송한 JWT를 복호화하여 요청을 전송합니다.
      2. 헤더 headerd에서 지정된 alg 방식을 통해 JWT를 암호화하여 확인하는 방식입니다.
profile
누구나 이해할 수 있도록

0개의 댓글