인증 & 인가

Minji Jeong·2021년 9월 27일
0

Web

목록 보기
5/6

웹사이트에서는 유저에게 해당하는 권한을 부여하기 위해 회원가입과 로그인 과정을 거친다. 인증과 인가는 프론트엔드와 백엔드가 유저 데이터를 주고 받기 위해 필수적으로 알아야 하는 개념이다.

인증(Authentication)

회원가입과 로그인하는 과정이다.
유저의 아이디, 패스워드, 이메일 등을 이용해서 지금 이 사이트를 이용하고자 하는 유저가 누구인지 확인하기 위한 절차이다.

비밀번호 관리 방법

비밀번호는 중요한 개인정보이다. 따라서 데이터베이스에 그대로 저장하게 되면, 개인정보가 유출될 위험이 높아진다.
이를 방지하기 위해, 프론트에서 전송한 비밀번호를 암호화하여 DB에 저장한다.

Hash

해시 알고리즘이 있는데, 이 해시와 같은 맥락이다.
해시 알고리즘은 비규칙적인 길이의 데이터를 해시 함수를 통해 고정된 길이의 데이터로 바꿔서 저장하는 방법이다. 데이터 길이에 상관없이 모든 자료를 빠르게 탐색하기 위해 사용하는 알고리즘이다.
key값(원본 데이터)과 Hash값(해싱 된 값)이 짝을 이루어 매핑된다.

패스워드 암호화도 해싱을 이용하는데, 일반적으로 단방향 해쉬 함수(one-way hashing function)가 쓰인다.
단방향이기 때문에 암호화는 쉽지만, 복호화는 할 수 없다.

패스워드: abc1234 ➡ 암호화: 1k343k4n360n5oj5k3 가능
1k343k4n360n5oj5k3를 통해 원본값(abc1234)를 아는 것은 불가능

Hashing의 취약점

위에서 언급했듯이, Hash는 데이터를 빨리 찾기 위해서 사용하는 알고리즘이다. 원본값과 해쉬값을 저장해놓은 해쉬테이블이 있는데, 해킹을 하고자 하는 사람이 미리 해쉬값들을 계산해 놓은 다음에 우리의 해쉬값과 비교를 한다면, 아주 빠르게 원본 문자열을 추출할 수 있다.

해커가 DB를 해킹하는 데에 걸리는 시간을 최대한 늘려야 하기 때문에,
Salting과 KeyStretching 방법을 사용하여 보안을 더 강화한다.

Salting

원본 문자열에 랜덤 문자열(솔트값)을 더하고, 그 값을 해싱하는 방법이다. 솔트값과 해싱된 값은 DB에 함께 저장된다.
백엔드에서 유저를 구분할 때, 클라이언트에서 받은 패스워드에
솔트값을 더해서 해싱한 값이 저장된 해싱값과 맞는지 비교한다.

Stretching

해싱을 여러번 반복하는 것이다.
솔트값을 붙여서 해싱한 값을 반복적으로 해싱함으로써,
해쉬된 값을 원본 데이터로 복호화 하는 시간을 늘리는 방법이다.

Bcrypt 라이브러리

Salting과 Stretching을 거치면, 보안이 강화되지만 그만큼 관리해야할 데이터가 많아진다. 알고리즘 종류, 솔트값, 해시 결과 값, 해싱 횟수 등
모든 것을 백엔드에서 직접 관리한다면 복잡할 것이다.
이를 도와주는 라이브러리가 Bcrypt 이고, 이를 사용하면 관련 DB를 별도로 설계할 필요가 없다고 한다.

인가(Authorization)

HTTP의 대표적인 특징은 각 통신은 독립적(Stateless) 이라는 것이다.
즉, 전에 통신에 성공했다고 해서 다음 페이지에서 그 상태를 유지하고 있지 않는다는 것이다. 따라서 페이지를 변경할 때 마다, 그때 그때 이 유저 정보를 확인해 주어야 한다.

유저가 로그인에 성공하고 나면, 서버에서 token값을 준다.
프론트에서는 유저가 페이지를 이동할 때, 이 token값을 첨부해서 서버에 보내야 하며, 서버는 token값으로 유저 정보와 권한을 확인한다.

JWT(Json Web Token)

  • Header
    토큰 타입, 해싱 알고리즘 정보 2가지를 담고 있다.
{
  "typ": "JWT",
  "alg": "HS256"
}
  • Payload
    토큰에 담을 정보가 들어있다.
{
  "user-id": "id1234",  // 유저 id
  "exp": 15309510  // 만료시간
}
  • Signature
    Header와 Payload값은 정보를 인코딩한 값이 들어있다.
    인코딩한 값은 디코딩하면 원본값을 바로 알 수 있는데, 토큰값은 다른 사람이 위변조 할 수 없어야 하므로, 이를 검증하기 위해 비밀키로 해쉬하여 만든다.
profile
쿼카를 사랑하는 프론트엔드 개발자입니다 :)

0개의 댓글