Session | 인증과 인가

Hyeonju L.·2020년 12월 10일
0

Sessions

목록 보기
6/8

1. 인증(Authentication)

인증이란 회원가입로그인을 의미한다.
개발자의 관점에서 우리가 제공하는 서비스를 누가 사용하는지, 어떻게 사용하는지(유료, 무료 등) 추적을 하기 위해 필요하며, 마케팅 또는 이슈 발생 시 대처를 위한 목적이 있다.
인증에 필요한 것은 아이디, 이메일주소, 비밀번호 등이 있는데, 이 중 비밀번호가 가장 중요하다.

1) 비밀번호 어떻게 관리해야 하는가?

  • 비밀번호를 관리하는 이유는 해킹으로부터 고객의 정보를 안전하게 보호하기 위함이며 개인정보보호법 준수
  • 개인정보보호법에 의거하여 '암호화'
    - 데이터베이스에 저장 시 개인 정보를 해싱하여 복원할 수 없도록 함
    - 통신 시 개인정보를 주고 받을 때 SSL 인증서를 적용하여 암호화(HTTPS)
    : 주소 옆에 자물쇠 잠겨있는 그림이 있는 건 SSL 인증서를 적용해 HTTPS로 보내지고 있다는 뜻이다.

2) 암호화는 어떻게 하는가?

단방향 해쉬

  • 해쉬란 list, string처럼 자료형 중 하나로 함수이다.
  • 인풋이 들어가서 아웃풋이 나오면 다시 인풋으로 들어갈 수 없다는 특징(복원불가)을 이용해 암호화에 적용되기 시작함.
  • 최근에는 HSA-256 등이 사용됨.
  • 당장 식별이 불가하지만 같은 알고리즘으로 해싱하면 항상 같은 결과가 나와 역추적이 가능

Salting & Key Stretching

  • 역추적이 가능한 해쉬(hash)를 보완하기 위해 나온 개념
  • 입력한 비밀번호와 임의로 생성한 문자열(salt)를 합쳐서 해싱한 해싱값 저장
  • key stretching은 salt와 hashing을 여러번 해서 해시값을 계산하는데 필요한 시간을 대폭 늘리고 원본 값을 유추하기 어렵게 만드는 것

bcrypt

salting & Key Stretching 대표적 라이브러리로 무료이며 사용하기 간편하며 거의 모든 언어를 지원한다. 해쉬 결과값에 salt값과 해쉬값, 반복 횟수를 함께 보관하기 때문에 비밀번호에 해싱을 적용하는데 있어 DB설계를 복잡하게 할 필요가 없다.
bcrypt를 통해 해싱된 결과 값(digest)구조는 아래와 같다

2. 인가(Authorization)

사용자가 서버에 로그인을 하면 해당 사용자가 맞는지 확인하는 과정.
HTTP의 stateless특징으로 인해 필요한 과정이다.

JWT(JSON Web Tokens)

access token을 생성하는 방법 중 가장 널리 사용되는 기술 중 하나.
유저 정보를 담은 JSON데이터를 암호화하여 클라이언트와 서버간에 주고 받는 것.

  • process
    - 유저가 로그인에 성공한 후에는 access token이라고 하는 암호화된 유저 정보를 첨부해서 request를 보냄
    - 그러면 서버에서는 access token을 복호화해서 해당 유저 정보를 얻음
    - 복호화해서 얻은 유저 아이디를 통해 해당 유저가 누군지 알 수 있게됨

    즉, 유저가 로그인을 하면 그 유저에게 Token을 부여해서 해당 이용자가 어떠한 활동을 할 때 토큰을 통해 유저의 로그인 여부를 확인할 수 있다.

  • JWT의 구조

    헤더 : 토큰의 타입과 해시 알고리즘 정보가 들어감 - 예시. {"alg":"HS256", "typ":"JWT"}
    내용 : 만료시간을 나타내는 공개클레임, 클라이언트와 서버간 협의하에 사용하는 비공개클레임(유저정보), 두가지 요소를 조합하여 작성됨 - 예시. {"user-id":1, "exp":1539517391}
    서명 : JWT가 원본 그대로라는 것을 확인할 때 사용

profile
What you think, you become. What you feel, you attract. What you imagine, you create.

0개의 댓글