API Key
서비스들이 거대해짐에 따라 기능들을 분리하기 시작하였는데 이를 위해 Module이나 Application들 간의 공유와 독립성을 보장하기 위한 기능들 등장
-> 그 중 제일 먼저 등장하고 가장 보편적으로 쓰이는 기술이 API Key
동작방식
- 사용자는 API Key 발급
- 해당 API를 사용하기 위해 Key와 함꼐 요청 보냄
- Application은 요청이 오면 Key를 통해 User 정보를 확인하여 누구의 Key인지 권한이 무엇인지 확인
- 해당 Key의 인증과 인가에 따라 데이터를 사용자에게 반환
문제점
- API Key를 사용자에게 직접 발급하고 해당 Key를 통해 통신을 하기 때문에 통신구간이 암호화가 잘 되어 있더라도 Key가 유출된 경우 대비하기 힘듦
-> 주기적은로 Key를 업데이트를 해야하기 때문에 번거롭고 예기치 못한 상황이 발생할 수 있음
- Key 한 가지로 정보를 제어하기 때문에 보안 문제가 발생하기 쉬운 편
OAuth2
- 인증 및 인가를 위한 오픈 프로토콜
- API Key의 단점을 메꾸기 위해 등장한 방식 ex) 페이스북, 트위터 등 SNS 로그인 기능
- 요청하고 요청받는 단순한 방식이 아니라 인증하는 부분이 추가외어 독립적으로 세분화됨
동작방식
- app(service)가 사용자에게 인증 요청
- 사용자가 app(service)에게 인증정보(id/pwd) 입력
- app(service)는 인증 서버에 인증 정보 전달
- 인증 서버는 access token 부여
- app(service)는 리소스 서버에 access token 전달
- 리소스서버는 보호된 리소스를 app(service)에 전달
문제점
- 기존 API Key 방식에 비해 더 복잡한 구조
- 통신에 사용하는 Token은 무의미한 문자열을 가지고 기본적으로 정해진 규칙없이 발행되기 때문에 증명확인 필요
JWT
- JSON Web Token
- 인증 흐름의 규약이 아닌 Token 작성에 대한 규약
- 인증 여부 확인을 위한 값, 유효성 검증을 위한 값, 인증 정보 자체를 담고 있기 때문에 인증 서버에 문지 않고도 사용 가능
문제점
- 토큰 자체가 인증 정보를 가지고 있기 때문에 민감한 정보는 인증 서버에 다시 접속하는 과정 필요
[참고 자료]
🔗링크1