Spring Security 4

Woo·2024년 6월 30일

Spring Security

목록 보기
2/3

CSRF

  • Spring Security 가 적용된 Application 이 CSRF 를 방어하도록 설정.
  • 특정 URL 에서는 어떠한 요청을 할 수 있게끔 설정할 수 있다.
  • 로그인을 할 때 마다 CSRF Token 을 설정한다. 어떤 요청을 하면 Token 을 전달한다.
  • Security 가 로그인에 접근할 수 있게 Config 파일을 수정한다.
  • 매 요청 마다 input type hidden 에 토큰을 생성한다. form 전송을 할 경우에는 form 내부에 sec:csrfInput 을 작성한다.
  • Form 을 사용하지 않는 ajax 는 head 안쪽에 sec:csrfMetaTags 를 추가해야 한다. post 요청 전에 csrf 토큰을 변수에 받고 객체 리터럴을 전달한다.
  • 로그인 뿐만 아니라 회원가입 또한 CSRF 를 적용해야 한다.
  • Config 클래스의 filterChain 에 .anyRequest().authenticated()); 내부에 URL 을 등록하고 form 태그 내부에 sec~ 을 추가한다.

CORS

  • Cross-Origin Resource Sharing 교차 출처 리소스 공유
  • 브라우저의 보안 정책 사항 중 하나이다.
  • 브라우저에 로드 된 사이트의 도메인 이외의 도메인에 대한 요청을 허용하지 않는 것이다.
    • 화면이 전환되는 요청과는 다르다.
    • RESTful API 같은 Ajax 요청만 해당된다.
  • 포트가 달라도 브라우저는 요청을 허용하지 않는다.
  • 다른 서버에서의 요청을 허용하려면 Config 클래스에서 포트를 허용해야 한다.

JWT

  • Json Web Token
  • 가장 일반적인 형태의 Web Application 형태
  • Backend Server 와 Frontend Server 가 하나로 합쳐진 형태 -> Monolithic
  • Backend 또는 Logic 에 문제가 생길 경우, Backend & Frontend 모두 사용할 수 없다.

개선된 형태의 WebApplication 형태

  • Backend 와 Frontend 가 완전히 분리된 형태 -> MSA : Micro Service Architecture
  • Client 와 Server 는 RESTful API 로 통신한다.
  • Backend 에 문제가 생기더라도 Frontend 에 큰 영향을 주지 않는다.
  • 단점은 장애가 생길 경우 복구 작업이 어렵다는 것이다.

MSA 형태의 문제점

  • Monolithic 형태의 Web Application 은 인증 및 인가를 한 서버내에서 모두 처리한다.
  • 인증/인가와 관련된 이슈가 존재하지 않는다.
  • MSA 형태의 Web Application 은 한 번의 인증으로 여러 서버와 통신을 해야 한다.
    • 인증 동기화의 문제가 발생한다.
    • 인증만 처리하는 인증 서버가 필요하다.
    • JSON 형태의 인증 정보를 클라이언트와 서버가 주고 받는다. (Json Web Token)

JWT 의 특징

  • 무상태성
    • HttpSession 은 서버에 사용자 정보를 저장하는 방법이다.
    • Token 방식은 서버가 사용자의 정보를 Token 이라는 형태로 클라이언트에게 전송한다.
    • 서버는 사용자의 정보를 가지지 않는다.
  • 확장성
    • JWT 는 서버가 사용자의 정보를 가지지 않기 때문에, 다른 서버의 API 를 사용할 때에도 동일한 토큰으로 인증을 처리할 수 있다.
    • 서비스를 위한 서버를 추가하더라도 인증과 관련된 이슈가 존재하지 않는다.
  • 무결성
    • 토큰을 발급 받은 이후부터 토큰 정보를 변경할 수 없다.
    • 악의적인 사용자가 토큰을 한 글자라도 변경할 경우, 인증 서버에서는 유효하지 않은 토큰으로 처리하게 된다.

JWT 사용

발급 및 검증

  • Dependency 를 추가한다.
  • jwt.secret (salt 와 마찬가지로 원문 salt 가 있어야 복호화를 할 수 있다.) jwt 암호화
  • JsonWebTokenProvider 클래스 생성
  • 대칭키 - 암호화, 복호화 할 때 쓰이는 키가 같은 키 jwt는 대칭키를 사용한다. (다를 경우 비대칭키)
  • Jwts.builder() => Jwt 의 멤버변수 초기화 (빌드패턴)
  • 사용자가 요청을 하면 토큰을 파라미터로 받고 대칭키를 통해 복호화를 진행한다.
  • user 에 있는 정보로 memberVO 로 초기화한다.
  • JwtAutenticationFilter 클래스에서 사용자의 요청을 검증한다.
  • doFilterInternal Jwt가 맞는지 검증한다. 요청의 URL 이 /api/ 로 시작하는 경우만 처리한다. 복호화가 잘 되어 memberVO 가 반환 되었다면 검증이 잘 되었다는 것이다.

JWT 생성



REST API

  • Representational State Transfer
  • 자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미한다.
  • Http URI (Uniform Resource Identifier) 를 통해 자원을 명시한다.
  • Http Method(POST,
  • HttpProtocol 을 호출하는 새로운 방법이다.
  • PostMan 을 사용해야 한다.
  • 브라우저로 하는 통신이 아니다. (Ajax 는 브라우저 통신)

API 와 Ajax 의 큰 차이

  • Ajax 는 파라미터를 전부 Form 데이터로 주고 받는다. (객체리터럴이지만 내부에서 Form 데이터로 모두 바뀐다.)
  • Ajax 는 브라우저에서 호출하는 방식을 사용한다.
  • 서버에서 인증을 수행한다.
  • API 는 브라우저에서 하는 요청이 아니다.
  • 인증의 주체가 서버가 아니라 클라이언트이다.
  • JSON 데이터로만 주고 받는다.

Postman

  • API 가 잘 동작하는지 검사한다.
  • 회원가입을 해야 save 를 할 수 있다. (훨씬 편함)
  • Curl 이라는 툴도 있다 (터미널)
  • Query Params (PathVariable 같은 느낌)
profile
개발자 준비생

0개의 댓글