TIL 24 | 인증인가 인가인가
인증(Authentication)
- Authentication은 유저의 identification을 확인하는 절차.
로그인 절차
- 유저 아이디와 비번 생성.
- 유저 비번 암호화 해서 DB에 저장.
- 유저 로그인 -> 아이디와 비밀번호 입력
- 유저가 입력한 비밀번호 암호화 한후 암호화되서 DB에 저장된 유저 비밀번호와 비교.
- 일치하면 로그인 성공
- 로그인 성공하면
access token
을 클라이언트에게 전송.
- 유저는 로그인 성공후 다음부터는
access token
을 첨부해서 request를 서버에 전송함으로써 매번 로그인 해야 되지 않도록 한다.
유저 비밀번호 암호화
- 유저의 비밀번호는 절대 비밀번호 그대로 DB에 저장 하지 않는다.
- 유저의 비밀번호는 꼭 암호화해서 저장 해야 한다.
- 비밀번호 암호에는 단방향 해쉬 함수(one-way hash function)가 일반적으로 쓰인다.
- 단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메시지인
다이제스트(digest)
를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어서 단방향성(one-way)
이라고 한다.
- 예를 들어, "test password"를 hash256이라는 해쉬 함수를 사용하면
0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
값이 나온다.
- 만일 "test password2"를 hash256 해쉬 함수를 사용하면
d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다.
In [21]: import hashlib
In [22]: m = hashlib.sha256()
In [23]: m.update(b"test password")
In [24]: m.hexdigest()
Out[24]: '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'
In [25]: m = hashlib.sha256()
In [26]: m.update(b"test password2")
In [27]: m.hexdigest()
Out[27]: 'd34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb'
Bcrypt
단방향 해쉬 함수의 취약점
Rainbow table attack
- 미리 해쉬값들을 계산해 놓은 테이블을 공격하는 것.
단방향 해쉬 함수의 취약점들을 보안하기 위해 사용하는 방법
Salting
- 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해쉬값을 계산하는 방법.
Key Stretching
- 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해쉬 하고, 이를 반복.
Salting과 Key Stretching을 구현한 해쉬 함수중 가장 널리 사용되는 것이 bcrypt이다. bcrypt는 처음부터 비밀번호를 단방향 암호화 하기 위해 만들어진 해쉬함수이다.
In [40]: import bcrypt
In [41]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt())
Out[41]: b'$2b$12$.XIJKgAepSrI5ghrJUaJa.ogLHJHLyY8ikIC.7gDoUMkaMfzNhGo6'
In [42]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex()
Out[42]: '243262243132242e6b426f39757a69666e344f563852694a43666b5165445469397448446c4d366635613542396847366d5132446d62744b70357353'
JWT(JSON Web Tokens)
access token
을 클라이언트에게 전송.access token
을 첨부해서 request를 서버에 전송함으로써 매번 로그인 해야 되지 않도록 한다.
- 단방향 해시 함수는 원본 메시지를 변환하여 암호화된 메시지인
다이제스트(digest)
를 생성한다. 원본 메시지를 알면 암호화된 메시지를 구하기는 쉽지만 암호화된 메시지로는 원본 메시지를 구할 수 없어서단방향성(one-way)
이라고 한다.- 예를 들어, "test password"를 hash256이라는 해쉬 함수를 사용하면
0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e
값이 나온다.- 만일 "test password2"를 hash256 해쉬 함수를 사용하면
d34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb
값이 나온다. 실제 비밀번호는 비슷하지만 해쉬 함수 값은 완전히 틀린것을 볼 수 있다. 이러한 효과를 avalance라고 하는데 비밀번호 해쉬 값을 해킹을 어렵게 만드는 하나의 요소이다.
In [21]: import hashlib
In [22]: m = hashlib.sha256()
In [23]: m.update(b"test password")
In [24]: m.hexdigest()
Out[24]: '0b47c69b1033498d5f33f5f7d97bb6a3126134751629f4d0185c115db44c094e'
In [25]: m = hashlib.sha256()
In [26]: m.update(b"test password2")
In [27]: m.hexdigest()
Out[27]: 'd34b32af5c7bc7f54153e2fdddf251550e7011e846b465e64207e8ccda4c1aeb'
Rainbow table attack
- 미리 해쉬값들을 계산해 놓은 테이블을 공격하는 것.Salting
- 실제 비밀번호 이외에 추가적으로 랜덤 데이터를 더해서 해쉬값을 계산하는 방법.Key Stretching
- 단방향 해쉬값을 계산 한 후 그 해쉬값을 또 해쉬 하고, 이를 반복.
In [40]: import bcrypt
In [41]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt())
Out[41]: b'$2b$12$.XIJKgAepSrI5ghrJUaJa.ogLHJHLyY8ikIC.7gDoUMkaMfzNhGo6'
In [42]: bcrypt.hashpw(b"secrete password", bcrypt.gensalt()).hex()
Out[42]: '243262243132242e6b426f39757a69666e344f563852694a43666b5165445469397448446c4d366635613542396847366d5132446d62744b70357353'
유저가 로그인에 성공한 후에는 access token
이라고 하는 암호화된 유저 정보를 첨부해서 request를 보내게 된다.
- 유저 로그인:
POST /auth HTTP/1.1
Host: localhost:5000
Content-Type: application/json
{
"username": "joe",
"password": "pass"
}
- access token:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNDQ0OTE3NjQwLCJuYmYiOjE0NDQ5MTc2NDAsImV4cCI6MTQ0NDkxNzk0MH0.KPmI6WSjRjlpzecPvs3q_T3cJQvAgJvaQAPtk1abC_E"
}
- 그러면 서버에서
access token
을 복호화해서 다음과 같은 정보(해당 유저 정보)를 얻게 된다.
{
user_id = 1
}
- 이런 절차를 통해 해당 유저가 매번 로그인 하지 않아도 로그인 할 수 있게 된다.
access token
을 생성하는 방법 중 가장 널리 사용되는 기술이 JWT이다.- JWT는 말 그대로 유저 정보를 담은 JSON 데이터를 암호화해서 클라이언트와 서버간에 주고 받는 것이다.
인가(Authorization)
- Authorization은 유저가 요청하는 request를 실행할 수 있는 권한이 있는 유저인가를 확인하는 절차.
- Authorization도 JWT를 통해서 구현 될 수 있다.
- access token
을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한도 확인 할 수 있다.
Authorization 절차
- Authentication 절차를 통해
access token
을 생성.
- 유저가 request를 보낼때
access token
을 첨부해서 보낸다.
- 서버에서는 유저가 보낸
access token
을 복호화.
- 복호화된 데이터를 통해 user id 획득.
- user id 이용해서 DB에서 해당유저의 권한 확인.
- 권한이 있으면 해당 요청 처리.
- 권한 없을 시 401 혹은 다른 에러코드 반환
Author And Source
이 문제에 관하여(TIL 24 | 인증인가 인가인가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@4_21ee/TIL-24-인증인가-인가인가
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
-
access token
을 통해 해당 유저 정보를 얻을 수 있음으로 해당 유저가 가지고 있는 권한도 확인 할 수 있다.access token
을 생성.access token
을 첨부해서 보낸다.access token
을 복호화.Author And Source
이 문제에 관하여(TIL 24 | 인증인가 인가인가), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@4_21ee/TIL-24-인증인가-인가인가저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)