될때까지

((인증과 인가)) 인증 & 인가 본문

학습/개념정리

((인증과 인가)) 인증 & 인가

랖니 2022. 7. 11. 14:39
728x90

1. 인증(Authentication)

유저의 아이디와 비밀번호를 확인하여 로그인에 성공시키는 경우처럼, 사용자의 신원을 확인하는 절차를 말한다.

 

1-1. 로그인 절차

  1. 회원가입을 할 때 사용자가 ID와 PW를 입력한다.
  2. 사용자가 입력한 PW는 암호화해서 DB에 저장한다.
  3. 사용자는 로그인할 때 ID와 PW를 입력한다.
  4. 이때 사용자가 입력한 PW를 다시 암호화한 뒤, 암호화되어서 DB에 저장되어있는 PW와 비교를 한다. 
  5. 일치하면 로그인 성공으로 사용자에게 토큰을 발급해준다.
  6. 로그인에 성공한 이후부터는 나 인증된 사용자야 라는 것을 알리기 위해 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값 저장 등)를 복잡하게 할 필요가 없다.

bcrypt를 통해 해싱된 digest의 구조

 

1-4. JWT(JSON WEB TOKEN)

JWT는 토큰을 생성하는 방법 중 하나다.

JWT는 header.payload.signature 세부분으로 구성된다.

  1.  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://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-JWTjson-web-token-%EB%9E%80-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC#JWT_(JSON_Web_Token) 

https://velog.io/@hahan/JWT%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://gorokke.tistory.com/181

https://jusths.tistory.com/158

728x90

'학습 > 개념정리' 카테고리의 다른 글

((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