일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 호이스팅
- javascript
- Jest
- Django
- OSI7계층
- manytomanyfield
- crud2
- 실행 컨텍스트
- JWT
- 자바스크립트
- docker
- pm2
- nodeJS
- bcrypt
- 프로미스
- 트랜잭션
- 장고초기세팅
- async/await
- django westagram
- 스코프
- wecode
- 노드
- node
- TypeError: this.boardRepository.createBoard is not a function
- CORS
- rebase
- westagram
- status code
- typescript
- on_delete
- Today
- Total
될때까지
((인증과 인가)) 인증 & 인가 본문
1. 인증(Authentication)
유저의 아이디와 비밀번호를 확인하여 로그인에 성공시키는 경우처럼, 사용자의 신원을 확인하는 절차를 말한다.
1-1. 로그인 절차
- 회원가입을 할 때 사용자가 ID와 PW를 입력한다.
- 사용자가 입력한 PW는 암호화해서 DB에 저장한다.
- 사용자는 로그인할 때 ID와 PW를 입력한다.
- 이때 사용자가 입력한 PW를 다시 암호화한 뒤, 암호화되어서 DB에 저장되어있는 PW와 비교를 한다.
- 일치하면 로그인 성공으로 사용자에게 토큰을 발급해준다.
- 로그인에 성공한 이후부터는 나 인증된 사용자야 라는 것을 알리기 위해 request를 날릴 때 토큰을 첨부하여 서버에 같이 전송한다.
1-2. 유저 비밀번호 암호화
유저의 비밀번호는 꼭 암호화해서 DB에 저장해야하는데 단방향 해쉬함수가 일반적으로 쓰인다.
단방향이란 말 그대로 원본 메시지를 변환하여 암호화된 메시지인 다이제스트를 생성한다. 단방향이기 때문에 복호화(거꾸로 알아내는 방법)는 불가능하다. 원본 메시지를 알면 암호화된 메시지를 구하기 쉽지만, 암호화된 메시지로는 원본 메시지를 구할 수 없다.
1234를 해시함수를 사용하여 생성한 메시지와 12345를 암호화한 메시지는 완전히 다르다.
하지만 DB에 같은 비밀번호를 사용한 사람이 생기면 똑같은 다이제스트가 저장되고, 이를 정리한 rainbow table이 생길 수 있다.
1-3. Bcrypt
단방향 해쉬함수도 단점이 있다.
rainbow table attack - 미리 해쉬값들을 계산해놓은 테이블을 사용해서 패스워드를 추측하면 알아낼 수 있다.
이런 취약점을 보완하기 위해 salting과 key stretching을 사용한다.
- salting : '소금친다' 실제 비밀번호 외에 랜덤 데이터를 더하여 해시값을 계산한다. (salt값을 저장해야함)
- key stretching : salting과 해싱을 여러번 반복해서 원본값을 유추하기 어렵게 만든다.
salting과 key stretching을 구현한 해시함수 라이브러리 중 가장 널리 사용되는 것이 bcrypt다.
- bcrypt는 hash결과값에 소금값과 해시값 및 반복횟수를 같이 보관하기 때문에 비밀번호 해싱을 적용하는 데 있어 DB설계(salting값 저장 등)를 복잡하게 할 필요가 없다.
1-4. JWT(JSON WEB TOKEN)
JWT는 토큰을 생성하는 방법 중 하나다.
JWT는 header.payload.signature 세부분으로 구성된다.
- header : 토큰의 타입과 해시 암호화 알고리즘 정보가 들어간다.
{
"alg" : "HS256",
"typ" : "JWT"
}
2. payload : 서버에서 첨부한 토큰에 담을 정보가 들어있다.
{
"user-id" : 1,
"exp" : 1539517391
}
-----> 1) + 2) 헤더와 페이로드는 암호화한 것이 아니라 단순 인코딩된 정보임으로 개인정보를 담으면 안된다.
3. signature : 이 토큰이 해당 서버로부터 생성된 것인지 증명하기 위해 사용된다. 헤더와 페이로드의 값을 인코딩한 뒤에, 그 값을 secret_key를 사용해서 헤더에서 정의한 알고리즘으로 해싱을 한 뒤 그 값을 다시 인코딩해서 생성한다.
-----> 시크릿키와 알고리즘 역시 유출되면 안된다.
서버에서 해당 토큰을 복호화하면 해당 유저 정보를 얻을 수 있게 된다.
2. 인가(Authorization)
유저가 요청하는 request를 실행할 권한이 있는지 확인하는 절차다.
(내 장바구니 목록은 로그인 이후에만 가능한 경우 처럼)
인가도 JWT를 통해 구현할 수 있다.
토큰에는 유저 정보를 확인할 수 있는 정보가 들어가있다(user-id처럼).
유저가 request를 보낼 때 토큰을 첨부해서 보내면 서버에서는 유저가 보낸 토큰을 복호화해서 user-id를 읽어낸다.
user-id가 DB에서 허용된 유저의 권한이라면 해당 요청을 처리하고, 권한이 없다면 에러 코드를 보낸다.
*참고자료*
위코드 노션페이지
https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
'학습 > 개념정리' 카테고리의 다른 글
((MySQL)) 자주 사용하는 명령어 정리 (0) | 2022.07.31 |
---|---|
에러메세지 정리 (0) | 2022.07.13 |
((HTTP)) HTTP란? 그리고 HTTP Methods와 Status Code (0) | 2022.06.30 |
((Database)) Linux & Terminal (0) | 2022.06.28 |
개념정리 :: DNS? (0) | 2022.06.17 |