TIL. 8 인증 & 인가

Hoontae.KIM·2021년 7월 27일
0
post-thumbnail

인증(Authentication)

간단하게 말하면 website 상에서 user를 식별하는것이다.

인증절차에 필요한 것

  • 아이디, 비밀번호 이메일 등이 있다.

비밀번호의 암호화

  • 비밀번호 그대로 DB에 저장하지 않는다.
    1) 해킹시 비밀번호가 그대로 노출된다
    2) 외부 해킹이 아니더라도 내부 개발자나 다른 사람들이 볼 수 있다.
  • 비밀번호는 꼭 암호화하여 저장한다.
    1) 해킹시 비밀번호가 그대로 노출되지 않는다.
    2) 내부 개발자도 알 수 없다.

단방향 해쉬

  • 비밀번호를 변환하여 암호화된 메시지인 다이제스트(digest)를 생성
  • 비밀번호를 알면 암호화된 비밀번호를 구하기는 쉽지만 암호화된 비밀번호는 원본 비밀번호를 구할 수 없어서 단방향성이라고 한다.

Bcrypt

단방향 해쉬에 몇가지의 취약점이 있다. bcrypt는 그것을 방지하기위해 Salting
Key Stretching을 제공해주는 대표적인 라이브러리다.

  • Salting
    실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해시값을 계산하는 방법.
  • Key Stretching
    단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해쉬 하고, 또 이를 반복하는 것을 말한다.

비밀번호를 해쉬

hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

encode : string 타입을 bytes 타입으로 전환시켜준다. - 부호화
decode : bytes 타입을 string 타입으로 전환시켜준다. - 복호화

<Bcrypt 형식 이미지>

암호화된 비밀번호가 일치한지 확인하기 위한방법

bcrypt.checkpw(request_password.encode('utf-8'),hashed_password)

해쉬된 비밀번호를 데이터 베이스에 보면 위 이미지와 같이 bcrypt된 암호가 저장된다. 요청한 비밀번호를 입력한뒤 위와 같은 코드를 입력하였을때 해시하기전 비밀번호와 같으면True가 그렇지 않은 경우False가 출력된다.

인가(Authorization)

간단하게 로그인 한 사람이 추가적인 서비스 이용할때 권한 있는 유저인지 확인하는 절차이다.

JWT (Json Web Token)

권한이 있는 유저인지 확인하기위해 토큰을 부여한다.
토큰을 부여하기 위해서는 DB의 SECRET_KEY를 알아야하고 연결해줘야하며

토큰생성

access_token = jwt.encode({'id' : 1}, SECRET_KEY, algorithm = 'HS256')

로그인에 성공한 후에는 access token이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.

#EX)

POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json

{
    "username": "joe",
    "password": "pass"
}

HTTP/1.1 200 OK
Content-Type: application/json

{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}

위와 같이 토큰이 발행되며 서버에서는 access token을 복호화 해서 해당 유저 정보를 얻게 된다.

토큰 복호화

jwt.decode(access_token, SECRET, algorithm = 'HS256')

위와 같이 입력하면 {'id': 1}의 값을 반환한다.
토큰을 활용하여 반대로 유저를 확인할 수도 있다.

JWT는 말 그대로 유저 정보를 담음 JSON 데이터를 암호화 해서 클라이언트와 서버간에 주고 받는 것이다.

JWT는 3가지로 이루어져있다.

1) 헤더 (header)

  • 토큰의 타입과 해싱알고리즘을 지정

2) 내용 (payload)

  • 등록된 (registered) 클레임 - 위 이미지네 나와있는 내용같은 경우
  • 공개 (public) 클레임 - 충돌이 방지된 이름을 가지기 위해서 URI 형식으로 사용
  • 비공개 (private) 클레임 - 위의 두클래임간에 (보통 클라이언트 <->서버) 협의하에 사용되는 클레임

3) 서명 (signature)

  • 헤더의 인코딩값과, 내용의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성
profile
💻 STUDY RECORD

0개의 댓글