Spring Security for JWT Token

조예빈·2024년 8월 8일
0

Coding Test

목록 보기
99/138

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에 적용해야 함
profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글