Back-End/React.js, 스프링 부트, AWS로 배우는 웹 개발 101

[React.js, 스프링 부트, AWS로 배우는 웹 개발 101][인증 백엔드 통합] - REST API 인증 기법

얄루몬 2022. 6. 21. 23:39

본 포스팅은 'React.js, 스프링 부트, AWS로 배우는 웹 개발 101 - 김다정'님의 책을 보고 작성되었습니다.


목차
1. Basic 인증
2. Bearer 인증
3. JSON 웹 토큰

0. 인증과 인가

  • 인증
    • 당신이 누구인가에 관한 문제이다.
    • 신원 확인과 관련된 사항을 생각하면 된다.
  • 인가
    • 당신이 사용할 수 있는 것에 관한 문제이다.
    • 신원이 확인된 사람이 어디까지 사용할 수 있는지를 생각하면 된다.

1. Basic 인증

  • HTTP는 무상태를 유지한다 했다. 이런 경우 로그인 상태를 유지하는 것을 빼면 무상태 유지를 하는 것이 맞다. 이 무상태 유지를 하는 가장 간단한 방법은 HTTP 요청에 아이디, 비밀번호를 같이 보내는 것이다.
  • 이런 방법을 Basic 인증이라고 한다.

Basic 인증의 문제점

  • Basic 인증은 HTTP 요청 헤더에 아이디 비밀번호를 인코딩해 보내기 때문에 이를 중간에 탈취해 다시 디코딩 하면 우리의 정보가 노출되는 심각한 문제가 발생하게 된다.(보안상 이슈가 발생)
  • 그렇기에 위와 같은 문제를 해결하기 위해서는 https를 사용해야 한다.(https는 http에 보안 개념이 추가된 프로토콜이다.)
  • 또한 Basic 인증을 사용하면 모든 요청이 로그인 요청이기 때문에 로그아웃 시킬 수 없고 여러 디바이스에 로그인 되어 있는 경우에도 한 번에 로그아웃 시킬 수 없다.
  • 요청을 확인하러 매번 저장 장소를 왔다 갔다 해야하기 때문에 DB에 과부하가 걸릴 확률이 높다.

2. Bearer 인증(토큰)

  • 토큰은 사용자를 구분할 수 있는 문자열로 최초 로그인 시에 서버가 토큰을 만들어주고 이를 사용하여 인증된 사용자임을 확인한다.

토큰 기반 인증 특징

  • Basic 인증과 다르게 아이디와 비밀번호를 매번 네트워크를 통해 전송해야 할 필요가 없어 보안 측면에서 조금 더 안전하다.
  • 서버가 토큰을 마음대로 생성할 수 있어서 사용자의 인가 정보 또는 유효 시간을 정해 관리할 수 있다.
  • 디바이스마다 다른 토큰을 생성해 디바이스마다 다른 유효 시간을 정해 임의 로그아웃을 할 수 있게 했다.

토큰 기반 인증 문제점

  • 스케일 문제는 여전히 해결하지 못한다.

3. JSON 웹 토큰

  • 서버에서 전자 서명된 토큰을 이용하면 인증에 따른 스케일 문제를 해결할 수 있다.
  • 우리는 전자 서명된 토큰을 이용해 스케일 문제를 해결한다. 이렇게 전자 서명된 토큰 중 하나가 JSON 웹 토큰이다.
  • {header}.{payload}.{singature}로 JWT 토큰은 구성되어 있다.

JWT란?

  • JWT에서 전자 서명이란 {헤더}.{페이로드}.{서명(시크릿 키)}와 시크릿키를 이용해 해시 함수에 돌린 함수화한 결과 값이다.
    • 여기서 시크릿키는 나만 알고있는 문자열, 비밀번호 같은 것이다. (너무 간단하지만 않다면 모두 가능하다.)
  • 서명된 부분만 확인하면 되기 때문에 인증 서버에 토큰의 유효성에 대해서 물어볼 필요가 없어져 스케일의 문제가 사라지게 된다. 
    • 인증 서버에 부하를 일으키지 않는다는 뜻이고 더 이상 인증 서버가 단일 장애점이 아니라는 뜻이다.

토큰을 훔쳐간다면?

HTTPS를 사용해 통신한다면 이런 문제는 일어나지 않지만 토큰을 도난 당했다면 해당 계정의 리소스에 접근할 수 있게 된다. 그렇기에 HTTPS를 사용해서 통신해야 한다!!!