본문 바로가기
study/Spring

spring security in action 5-11장

by stilinski 2023. 4. 17.
728x90

---

5장

 

Authentication provider는 authentication 객체 인증하고 인스턴스 반환.

supports()를 통해 처리할 수 있는 유형의 auth객체인지 확인.

그러나 supports에서 true가 났어도 authenticate에서 null을 반환할 수 있음.

해당 auth provider가 처리할 수 있는 유형일지라도 처리할 수 없는 종류일수도 있기때문.

글귀 사진

 

 

---

Authentication 객체

자바 시큐리티 api의 Principal을 extends 함.

호환성 측면에서 이점이 됨.

다른 방식으로 인증을 구현했어도 스프링 시큐리티로 더 쉽게 마이그레이션 할 수 있음.

 

---

 

Security Context

AuthManager는 인증 프로세스를 완료한 후 Authentication 인스턴스를 Security Context에 저장한다.

Security Context의 주 책임은 Authentication 객체를 저장하는 일.

 

securityContext를 관리하는 객체 securityContextHolder

세 가지 전략

1. 각 스레드가 보안 컨텍스트에 세부정보 저장

2. 비동기 메서드 호출시 보안 컨텍스트를 다음 스레드로 복사하도록 스프링 시큐리티에 지시

3. 모든 스레드가 같은 보안 컨텍스트 인스턴스 참조.

 

 

 

 

callable

다른 스레드에서 실행될 수도 있는 인스턴스를 배출해내는(?) 클래스들을 위한 인터페이스. 

 

runnable과 비슷하지만 runnable은 반환값이 없음.

 

둘 중 하나 생성 후  그게 밑의 사진에서 1번

스레드풀 생성 -2

작업 전달 - 3

get()을 통해 작업결과를 전달받음.

 

스레드풀을 생성하고 필요할때 스레스생성. 이미 생성된게 있으면 생성된거 씀.

 

---

HTTP Basic 인증과 양식 기반 로그인 인증 이해하기.

Http basic - 유저 아이디 비번을 base64로 인코딩한 문자열을 Authorization 헤더로 넣는다.

 

 

AuthenticationEntryPoint

인증실패 응답 맞춤

 

 

.authorizeRequests()

HttpServletRequest 를 베이스로 requestMatcher를 이용해서 접근 제한한다는 것을 의미.

 

 

 

 ---

7장 권한 부여 구성 : 엑세스 제한

 

권한과 역할

anyRequest() - url이나 http 방식 관계없이 모든 요청에 규칙 적용.

 

권한

hasAuthority()

hasAnyAuthority() - 주어진 권한 중 하나라도 있을 때

access() - spring EL 사용

 

역할도 위랑 마찬가지.

 

시간에 따라 접근은 제한한다던지 할때 access 사용. 되도록 사용 안하길 권장.

 

denyAll() 도 있음.

 

 

---

8장 권한 부여 구성 : 제한적용

 

- antMatchers

- mvcMatchers

- regexMatchers

 

antMatchers vs mvcMatchers

mvcMatcher 권장. 왜냐하면 mvcMatcher의 경로를 해석하는 방법과 스프링이 경로를 엔드포인트에 매핑할때 해석하는 방법이 같기때문. 예를들어 /hello 라고 경로를 지정했을 경우, antMatcher는 /hello/를 같은 것이라라고 인식을 못하지만 mvc는 /hello , /hello/ 둘 다 같은 것으로 인식.

 

 

인증실패 또다른 원인

*사용자 이름과 암호가 필요하지 않은 엔드포인트여도 만약 굳이 제공했다면 스프링시큐리티는 인증프로세스에서 이를 확인, 인증이 실패하면 응답상태 401권한없음 뜸.

 

연산자 * 와 **

matcher에서 *연산자 사용할때 유의

*은 한글자 **은 여러글자

 

a/**/c = a/d/d/d/d/c , a/b/c, a/sfadf/c

a/*/c = a/b/c, a/d/c

 

 

 

---

9장 필터구현

 

- 개발자가 작성하는 구성에 따라 필터체인 정의가 영향을 받음.

- 같은 위치에 필터 2개를 추가 or 등록하면 필터가 호출되는 순서는 무작위이다.

 

OncePerRequestFilter

- 요청당 한번만 실행되도록 보장. 

사실 필터가 요청당 한번만 실행되도록 보장되지는 않음.

OncePer 필터를 사용하면 doFilter()가 한번만 실행될 수 있음.

로깅같은거 once이용하면 좋음

 

- HttpServletRequest와 HttpServletResponse 를 형변환해서 직접 불러옴

Filter의 경우 ServletRequest와 Response를 직접 형 변환해서 사용해야함.

 

- 특정 요청에는 적용 안하도록 shouldNotFilter메서드 재정의해서 적용 가능.

 

 

---

 

 10장 CSRF 와 CORS

 

csrf(Cross Site Request Forgery) 보호 작동방식

맨처음에 http get 요청이 들어왔을 때 response에 고유 토큰을 포함해서 줌

앞으로 헤더에 해당 고유 토큰이 들어있는 요청만 변경작업 가능(POST, PUT, DELETE 등)

보통 http세션에 csrf토큰 저장.

 

cors(cross origin resource sharing)

원래는 한 웹어플리케이션에서 다른 도메인에 요청하는 것을 허용하지 않음.

그걸 완화하기위해 cors적용.

http 헤더를 기반으로 작동

localhost 와 127.0.0.1 다른 도메인으로 인식.

 

preflight (사전) 요청

cors 를 적용하지 않았는데도 호출이 되는 상황이 있을 수 있음.

종종 브라우저는 요청을 허용해야 하는지 테스트하기 위해 먼저 HTTP OPTIONS방식으로 메서드를 호출하기도 함.

 

 

 

http OPTIONS?

서버와 브라우저가 통신하기 위한 통신 옵션을 확인하기 위해 사용.

서버가 어떤 method, header, content type을 지원하는지 알 수 있다.

https://velog.io/@awesome-hong/HTTP-Options-%EC%9A%94%EC%B2%AD%EC%9D%80-%EB%AD%98%EA%B9%8C

 

[HTTP] Options 요청은 뭘까?

프로젝트에서 API서버를 따로 생성하여 프론트엔드와 통신했다. 그런데 요청한 메소드 이전에 Request Method: OPTIONS 요청이 네트워크탭에 있는 것을 확인했다. 통신 Type도 XMLHttpRequest (XHR) 가 아닌 pre

velog.io

 

---

 

11장 책임의 분리

MFA(multi-factor authentication) 다단계 인증

728x90

댓글