본문 바로가기
spring

Spring security - Authorization

by 김선지 2024. 3. 8.

Spring Projects

 

종류: Spring FrameWork에서 발전했다. 이렇게 많다.

 Spring Security: 웹 어플이나. Rest api에 인증, 권한을 추가하는 경우

 Spring Data: 다른 타입의 데이터베이스를 통합하는 경우

 Spring integration: 다른 어플리케이션과의 통합 관련 문제를 도와주는 프로젝트

 Spring Boot: microservice를 빌드해주는 유명한 프레임워크(프로젝트)

 Spring Cloud: 스프링 네이티브 애플리케이션을 빌드해주는 프로젝트

 

스프링 에코 시스템이 유명한 이유

느슨한 결합: 빈과 의존성의 연결을 느슨하게 해서 유지 보수가 쉽다.

Reduced Boilerplate Code (상용구 코드 줄여줌): 비즈니스 로직에만 집중할 수 있게 해준다. (확인된 예외는 모두 런타임 또는 Unchecked Exception으로 반환하기 때문에 exception handling 불요, 코드의 양을 줄여준다.)

Architectural Flexibility: Spring Modules and Projects(원하는 프로젝트, 모듈만 뽑아 쓸 수 있다)

계속 발전하고 있다. (솔직히 안전함을 빌미로 뭔가 자유를 희생하는 느낌이 드는 것 같은 프레임워크라는 생각을 지울 수 없다)


 Spring Security

 

인코딩 vs 해싱 vs 암호화

 

    인코딩: transform data – 키나 패스워드 사용 x, 데이터보안에 적합 x (데이터의 효율적 전송, 저장 목적)

 

    해싱: 해싱해서 해시 String으로 바꿈. 복호화 불가능. (데이터 무결성 검증하는 것이 목적, 비밀번호 저장) – SHA-256 안전하지 않음 why? 요즘 기술이 좋아가지고 금방 푼다.

 

    인크립션(암호화): keypassword를 이용해서 암호화/복호화가 가능하다. 암호화/ 복호화를 위해서는 키나 패스워드가 필요함. 키나 패스워드를 이용한 디코딩 알고리즘을 통해 텍스트를 구할 수 있음 (데이터 보호 목적)

 

Spring security Authentication의 이해

인증은 spring security 필터 체인의 일부로서 이루어진다.

요청이 유입될때마다 spring security가 이걸 가로채고 필터체인이 실행됨. 그 필터의 일부로서 인증확인이 이루어짐

 

인증 순서

 

1.     AuthenticationManager – 인증을 담당하는 인터페이스

 

2.     AuthenticationProvider – 특정한 인증 타입을 제공하는 인터페이스 (spring security에서는 다양한 타입의 authenticationProvider가 동시에 작동하고있음)

ex) JwtAuthenticationProvider – JWT Authentication에 대한 인증타입 제공

 

3.     UserDetailService - AuthenticationProvider들이 대화하는 인터페이스, 유저 데이터를 로드하는 핵심 인터페이스, username에 해당하는 데이터를 받아서 이를 AuthenticationProvider에 제공, AuthenticationProvider detail, 세부정보를 받아서 credencial과 비교하여 확인한다. 이게 성공하면 principal authenticationAuthentication에 채워넣는다.

 

4.     인증에 성공하면 결과는 어디 저장? SecurityContextHolder에 저장 그 안에는 SecurityContext가 있고 거기에 Authentication이 저장된다. 요청이 도착하면 거기는 Authentication안에는 credential 만 있다. AuthenticationManager가 요청을 인증하면 그제서야 Principalauthority도 있다.

 

Spring security에서 Authentication3가지 것들을 의미함.

Authenticate() 메서드가 호출되기 전에는 Authentication에는 credencial만 포함

credencial이 유효한지 알기 위해서 AuthenticationManage는 수많은 AuthenticationProvider들과 상호작용을 함

 

 

Authenticate 메서드가 성공하면 (인증에 성공하면), 주체와 권한도 포함하게 됨

a.     Credencial, 자격증명. Useridpassword

b.     Principal, 사용자에 대한 세부 정보(나이, 주소 등)

c.     Authorities: 주체가 가지고 있는 roleAutorities

 

이러고 나서 만약에 로그인을 한다고 하면 return 해주는 값은 그냥 토큰 그 자체일텐데, 어디 뭐 쿠키에다가 저장하나? 싶었다. 근데 REST API는 따로 세션이 있거나 하지 않기 때문에 React의 경우 그냥 react단 쿠키에 저장하지 않을까,. 라는 생각을 했다.

근데 뭐 로컬스토리지나 세션스토리지에 저장한다고 한다.

이렇게 되면 요청할 때마다 header에 bearer 토큰을 일일이 보내줘야 하지 않을까 싶다.

 

'spring' 카테고리의 다른 글

Spring Framework, 객체지향, SOLID  (0) 2024.05.20
AOP  (0) 2024.05.19
Spring boot의 컨텐츠 rendering 동작 과정, 컴포넌트 스캔, 자동의존관계 설정  (0) 2024.05.15
Spring Security 기본  (0) 2024.03.03
Spring 용어 정의  (0) 2024.02.27