TIL. 8 인증 & 인가
인증(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 타입으로 전환시켜준다. - 복호화
간단하게 말하면 website 상에서 user를 식별하는것이다.
1) 해킹시 비밀번호가 그대로 노출된다
2) 외부 해킹이 아니더라도 내부 개발자나 다른 사람들이 볼 수 있다.
1) 해킹시 비밀번호가 그대로 노출되지 않는다.
2) 내부 개발자도 알 수 없다.
단방향 해쉬에 몇가지의 취약점이 있다. bcrypt는 그것을 방지하기위해 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)
- 헤더의 인코딩값과, 내용의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성
Author And Source
이 문제에 관하여(TIL. 8 인증 & 인가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kim-hoontae/TIL.-8-인증-인가저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)