hayu's 개발 일지

[TIL]240329 스프링 부트와 AWS로 혼자 구현하는 웹서비스: -5장 스프링 시큐리티 & 인증, 인가 본문

스터디/spring

[TIL]240329 스프링 부트와 AWS로 혼자 구현하는 웹서비스: -5장 스프링 시큐리티 & 인증, 인가

hayu00 2024. 3. 29. 21:13

인증(Authentication)이란?

  • 인증이란, 식별 가능한 정보(이름, 이메일 등)를 이용하여 서비스에 등록 유저의 신원 입증하는 과정이다. (신원 확인)
  • 인가 이전에 완료 되며 일반적으로 회원의 로그인 정보가 필요하다. 만약 인증이 실패하면 클라이언트는 401 에러를 응답받는다.
  • 나의 서비스에 등록된 사용자에게만 서비스를 제공한다는 뜻이다.

인가(Authorization)란?

  • 인증된 사용자가 접근하려는 자원에 대한 권한이 있는지 확인하는 절차이다.
  • 인가는 항상 앞에 인증이라는 프로세스가 필요하다.(인증하지 않은 유저의 권한을 알 수 없기 때문이다.)
  • 회원의 권한이나 역할이 필요하다. 만약 인가가 실패하면 클라이언트는 403 에러를 응답받는다.

인증 방식

쿠키 세션 방식

  • 사용자의 정보를 세션에 저장하여 서버에서 관리하는 것이다. (정보를 저장해서 로그인을 유지)

→ ‘특정 유저가 로그인 되었다’는 상태를 저장한다.

쿠키 세션 방식

jwt 토큰 방식

  • JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다.
  • JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP헤더에 실어 서버가 클라이언트를 식별한다.

jwt 토큰 방식

 

다른 채널을 통해 인증(OAuth)

스프링 시큐리티(Spring Security)란?

  • 스프링 시큐리티는 스프링 기반 어플리케이션의 보안을 담당하는 강력한 프레임워크이다.
  • 인증, 인가와 관련된 많은 기능을 제공한다.
  • 필터(Filter) 기반으로 동작하여 스프링 MVC와는 분리되어 동작한다.
  • 필터(Filter): 필터는 체인처럼 엮어있기 때문에 필터 체인이라고도 불린다. 모든 request는 이 필터 체인을 반드시 거쳐야 한다.

스프링 시큐리티 주요 모듈

  • Authentication : 접근하는 유저의 정보와 권한을 담는 인터페이스이다.
  • SecurityContext : Authentication을 보관하는 역할을 한다.
  • SecurityContextHolder : 보안 주체의 세부 정보를 포함하여 현재 보안 컨텍스트에 대한 세부 정보가 저장된다.
  • UserDetails : Authentication 객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용된다. UserDetails를 implements 하여 처리할 수 있다.
  • implements : 인터페이스에서 지정한 것을 이행하는 것이다.
  • UserDetailsService : DB의 사용자 정보를 조회하는 역할을 한다.
  • UsernamePasswordAuthenticationToken : User 의 ID 가 Principal 역할을 하고, Password 가 Credential 의 역할을 한다.
  • Principal : 유저에 해당하는 정보이다.
  • AuthenticationManage : 인증에 대한 부분을 처리하는 곳이다. 실질적으로는 AuthenticationManage에 등록된 AuthenticationProvider에 의해 처리된다.
  • AuthenticationProvider : 실제 인증에 대한 부분을 처리하는데, 인증 전의 Authentication 객체를 받아서 인증이 완료된 객체를 반환하는 역할을 한다.

스프링 시큐리티 인증 과정

 

1. 클라이언트(유저)가 로그인을 시도한다.

2. AuthenticationFilter에서 인증을 처리한다. + 필터 중에 (UsernamePassAuthenticationFilter)에서 인증을 처리한다.

3. UsernamePasswordAuthenticationToken을 발급한다.

4. AuthenticationFilter는 AuthenticationManager에게 이 토큰을 전달한다.

5. AuthenticationManage는 인증을 위해 AuthenticationProvider에게 토큰을 전달한다.

+ AuthenticationManager는 전달받은 토큰에 대한 사용자의 유효성 검사를 하는 역할이고 AuthenticationProvider는 그 토큰의 인증을 반환하는 역할이다.

6. AuthenticationProvider는 전달받은 토큰을 반환하여 UserDetailsService에 넘겨준다.

7. UserDetailsService는 전달받은 사용자 정보를 통해 DB에 알맞은 사용자를 찾고 이를 기반으로 UserDetails를 반환한다.

8. AuthenticationProvider는 전달 받은 UserDetails를 인증해 성공하면 AuthenticationManager에게 권한을 담은 토큰을 전달한다.

9. AuthenticationManager는 AuthenticationFilter에게 토큰을 전달한다.

10. AuthenticationFilter가 UserDetails 정보를 SecurityContextHolder에 저장한다.

 

아쉬운 점

- 인가 처리 과정에 대한 자료가 별로 없었다. 그 부분에 대해서도 공부하면 좋을 것 같다.

 

참고 자료

- https://hello-judy-world.tistory.com/216

- https://k3068.tistory.com/88

- https://velog.io/@impala/Spring-Security-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0-%EC%9D%B8%EC%A6%9D-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

- https://velog.io/@mooh2jj/Security-%EC%9D%B8%EC%A6%9D%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC