인증(Authentication)과 인가(Authorization)
- 인증은 사용자가 누구인지 확인하는 절차, 회원가입하고 로그인 하는 것을 말한다.
- 인가는 사용자가 서비스에서 제공하는 기능을 사용할 수 있는 권한이 있는지 확인하는 절차를 말한다.
Spring Security
- Spring Security는 filter chain을 기반으로 인증과 인가를 수행해서 보안 기능을 제공한다.
- filter는 http 요청이 들어오면 filter에 통과 시켜서 보안 작업을 수행합니다.
- 로그인 같은 요청은 예외 처리를 통해 인가 작업이 없어도 사용 가능하도록 설정 가능
Spring Security 처리 과정
- 처음에 요청이 들어오면 AuthenticationFilter(UsernamePassAuthenticationFilter)를 거친다.
- 요청에 따른 UsernamePasswordAuthenticationToken을 생성한다. (Authentication 인터페이스의 구현체다.)
- UsernamePasswordAuthenticationToken(alias Token)을 AuthenticationManager에게 이 Token은 올바른 유저인지 물어본다.
- AuthenticationManager는 1개 이상의 AuthenticationProvider(alias A-Provider)를 갖고 있는데, A-Provider는 Token 객체를 적절히 판단하여 인증처리를 할려고 한다.
- A-Provider가 우리가 직접 구현한 서비스(UserDetailsService 구현 클래스)에 해당 유저에게 인증요청을 보내 사용자 정보를 가져온다.
- UserDetailsService 구현 클래스는 사용자 정보를 가져와 UserDetails를 반환한다.
- Provider는 UserDetailsService에서 반환된 UserDetails와 클라이언트가 제공한 인증정보(Token)를 대조해서 이용자가 정당한 사용권한을 가지고 있는지 확인한다.
- 그리고 SecurityContext에 저장한다.
사용자 정의 filter
- jwt를 사용해서 구현하는 경우 사용자 정의 filter를 구현해야 합니다.
- JWT의 유효성 검사 -> 토큰이 만료된 것인지 유효한지에 대해서 체크해야한다.
- 사용자 정의 인증 로직 -> 외부 API 등을 호출해야하는 경우에 이를 처리하기 위해서 필터를 추가 구성한다.
- 권한 부여 -> JWT 토큰은 주로 인증에 사용되지만, 권한 부여를 사용해서 특정 리소스에 대한 접근 권한을 확인해야하기에 사용자가 특정 엔드포인트를 필터에 추가 구성한다.
- 추가 보안 -> XSS, CSRF 공격 등과 같은 보안 취약점 방지를 위한 필터를 추가로 구성한다.
JWT(JSON Web Token)
- 인증 및 권한과 관련된 정보를 안전하게 전달하기 위한 JSON 형식의 암호화된 문자열
- JWT는 헤더, 페이로드, 시그니처로 구성되어 있다.
- 헤더: 정보(토큰)의 종류와 암호화 알고리즘 저장
- 페이로드: 암호화한 정보(전송할 데이터)를 저장
- 헤더와 페이로드를 검증하기 위한 정보를 저장
장점
- 간단하고 가벼운 구조로 전송에 효율적이다.
- HTTP 헤더에 포함하여 전송할 수 있어서 별도의 인증 프로토콜을 구현할 필요가 없다.
- 다양한 언어와 플랫폼에서 사용 가능
동작 방식
- 서버는 사용자의 인증 정보를 사용하여 JWT를 생성한다.(아이디와 비밀번호로 DB와 일치하는지 확인)
- 클라이언트가 JWT 토큰을 저장하고 있다가 요청마다 헤더에 JWT 토큰을 담아서 보내서 서버가 권한을 확인한다.
출처 : https://velog.io/@mooh2jj/Security-%EC%9D%B8%EC%A6%9D%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC#spring-security%EC%9D%98-%EB%82%B4%EB%B6%80-%EA%B5%AC%EC%A1%B0
https://velog.io/@sujin-create/Spring-spring-security%EC%99%80-JWT-%EC%9D%B8%EC%A6%9D-%EC%9D%B8%EA%B0%80-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0#3-jwt%EC%99%80-spring-security-%ED%95%A8%EA%BB%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
'Dev' 카테고리의 다른 글
fcm 이용해서 앱 푸쉬 구현 (0) | 2024.12.04 |
---|---|
소켓 통신(채팅방 구현) (0) | 2024.12.04 |
OCR로 영수증 데이터 가져와서 식품 데이터 분류하기(분류 모델 만들기) + Trouble shooting (0) | 2024.12.04 |
ElasticSearch로 검색 성능 높이기 (0) | 2024.12.04 |
Swagger 사용하기 (1) | 2024.12.04 |