https://spring.io/projects/spring-security
Token
토큰 : 내가 이 API를 써도 되는지에 대한 인증
리액트 서버에서 API 서버로 요청->요청은 웹사이트이기 때문에 누구나 할 수 있음. 이게 많아지면 디도스가 됨. 인증되지 않은 사용자가 데이터를 달라고 요청하면 주면 안되기 때문에 토큰 사용
Cross-Origin Resource Sharing
https://docs.tosspayments.com/resources/glossary/cors
https://velog.io/@y_bin/CORSCross-Origin-Resource-Sharing
- CORS : 교차 출처 리소스 공유
- 출처가 다른 서버 간의 리소스 공유를 허락하는 것
- 서로 다른 출처라도 리소스 요처ㅇ, 응답을 허용할 수 있도록 하는 정책
- 대부분의 에러는 CORS가 가능하도록 설정하라는 내용으로 이루어짐
- 브라우저에서 비동기로 다른 도메인의 주소를 요청하면 발생하는 에러
- 출처가 다르더라도 요청과 응답을 주고받을 수 있도록 서버에 리소스 호출이 허용된 출처(Origin)를 명시해 주는 정책
- 도메인이 다르면 비동기로 호출이 안 되기 때문에 토큰을 사용하여 내 API를 비동기로 호출했을 때 허락하는 것
- 핸드폰 IP는 매일 바뀜
JWT 토큰
- JSON Web Token
- API 서버 : 순수하게 원하는 데이터만을 제공하는 서버 -> 데이터만 제공하기 때문에 클라이언트의 기술이 어떻게 이루어지는지는 중요하지 않고, 서버의 데이터를 여러 형태로 사용하는 것이 가능
JWT 토큰 생성/검증
https://jwt.io
왼쪽 : 실제로 주고받는 JWT 문자열, 오른쪽 : JWT 구성 요소들
- 인증에 성공한 후에는 사용자가 API를 호출할 때 사용할 적절한 데이터를 만들어서 전송해 주어야 함
- 인증이 사공한 사용자에게는 특수한 문자열(JWT)를 전송
- API를 호출할 때는 JWT를 읽어서 해당 Request가 정상적인 요청인지를 확인
JWT 문자열 구성
- Header : 토큰 타입과 알고리즘을 의미. HBS256 혹은 RSA를 주로 사용
- Payload : 이름(name)과 값(value)의 쌍을 Claim이라고 하고, claims를 모아둔 객체를 의미
- Signature : 헤더의 인코딩 값과 정보의 인코딩 값을 합쳐 비밀 키로 해시 함수로 처리한 결과
- JWT는 단순히 Header와 Payload를 단순히 Base64로 인코딩하기 때문에 제 3자의 디코딩 시 문제가 발생함. 그래서 Signature를 사용해서 암호화된 값도 같이 사용해줌 -> secret key를 모르면 올바르게 검증할 수 없기 때문
Filter에 JWT 적용하기
- JWT에 대한 생성과 검증에 문제가 없다면 최종적으로 ApiLoginFilter / ApiCheckFilter에 적용해야 함