이 글은 '스프링 부트 핵심 가이드 - 스프링 부트를 활용한 애플리케이션 개발 실무' 책을 통해 학습한 내용을 정리한 글입니다.
보안 용어
인증 (Authentication)
- 사용자가 누구인지 확인하는 단계를 의미
- ex) 로그인
로그인에 성공하면 어플리케이션 서버는 응답으로 사용자에게 토큰(token)을 전달하고, 로그인에 실패한 사용자는 토큰을 전달받지 못해 원하는 리소스에 접근할 수 없다.
인가 (Authorization)
- 인증을 통해 검증된 사용자가 어플리케이션 내부의 리소스에 접근할 때 사용자가 해당 리소스에 접근할 권리가 있는지를 확인하는 과정
- ex) 관리자 게시판은 관리자만 접근을 허가한다.
접근 주체 (Principal)
- 어플리케이션의 기능을 사용하는 주체를 의미
- 접근 주체는 사용자/디바이스/시스템 등이 될 수 있다.
- 어플리케이션은 인증 과정을 통해 접근 주체가 신뢰할 수 있는지 확인하고, 인가 과정을 통해 접근 주체엑 부여된 권한을 확인한는 과정 등을 거친다.
스프링 시큐리티 (Spring Security)
어플리케이션의 인증, 인가 등의 보안 기능을 제공하는 스프링 하위 프로젝트 중 하나이다.
서블릿 필터(Servlet Filter)를 기반으로 동작한다.
인증 수행 과정
- 인증 필터 처리 : 클라이언트로부터 요청을 받으면 서블릿 필터에서 SecurityFilterChain으로 작업이 위임되고,
AuthenticationFilter(UsernamePasswordAuthenticationFilter)에서 인증을 처리한다. - 인증 토큰 생성 : AuthenticationFilter는 요청 객체(HttpServletRequest)에서 username, password를 추출해서 토큰을 생성한다.
- 토큰 전달 : AuthenticationManager에게 토큰을 전달한다. AuthenticationManager는 인증을 관리하는 인터페이스이며, 이를 구현하는 구현체는 ProviderManager이다.
- 토큰 검증 : ProviderManager는 생성된 토큰을 AuthenticationProvider에게 전달하여 인증을 위한 작업을 수행한다.
- 사용자 정보 조회 : AuthenticationProvider는 토큰의 정보를 UserDetailsService에 전달한다. UserDetailsService는 이 정보를 사용하여 DB에서 일치하는 사용자를 찾고, 해당 정보를 답은 UserDetails 객체를 생성한다.
- 인증 수행 : 생성된 UserDetails객체는 AuthenticationProvider로 전달되어 실제 인증 작업을 수핸한다. 인증에 성공하면 ProviderMAnager로 다시 인증 정보와 권한을 담은 토큰을 전달한다.
- 토큰 저장 : ProviderManager는 검증된 토큰을 AuthenticationFilter로 전달한다. AuthenticationFilter는 검증된 토큰을 SecurityContextHolder에 있는 SecurityContext에 저장한다.
JWT (JSON Web Token)
당사자 간에 정보를 JSON 형태로 안전하게 전송하기 위한 토큰이다. URL로 이용할 수 있는 문자열로만 구성되어 있으며, 디지털 서명이 적용되어 있어 신뢰할 수 있다. JWT는 주로 서버와의 통신에서 권한 인가를 위해 사용되며, HTTP 구성요소 어디든 위치할 수 있다.
JWT의 구조
헤더(Header)
검증과 관련된 내용을 담고 있다. 헤더는 Base64Url 형식으로 인코딩되어 사용된다.
- alg 속성 : 해싱 알고리즘 지정 (보통 SHA256 또는 RSA를 사용)
- typ 속성 : 토큰의 타입 지정
내용(Payload)
토큰에 담는 정보를 포함하며 내용에 포함된 속성들은 클레임(Claim)이라고 한다.
- 등록된 클레임(Registered Claims)
- iss : JWT의 발급자(Issuer) 주체
- sub : JWT의 제목(Subject)
- aud : JWT의 수신인(Audience)
- exp : JWT의 만료시간(Expiration) / NumericDate 형식 사용
- nbf : 'Not Before'
- iat : JWT가 발급된 시간(Issued At)
- jti : JWT의 식별자(JWT ID) / 중복 처리 방지하기위해 사용
- 공개 클레임(Public Claims) : 키 값을 마음대로 정의할 수 있다. 다만 충돌이 발생하지 않을 이름으로 설정해야 한다.
- 비공개 클레임(Private Claims) : 통신 간에 상호 합의되고 등록된 클레임과 공개된 클레임이 아닌 클레임을 의미
서명(Signature)
인코딩된 헤더, 인코딩된 내용, 비밀키, 헤더의 알고리즘 속성값을 가져와 생성된다.
'북 스터디 > 스프링 부트 핵심 가이드' 카테고리의 다른 글
[스프링 부트] 11장. 액추에이터 활용하기 ~ 12장. 서버 간 통신 (0) | 2023.07.02 |
---|---|
[스프링 부트] 10장. 유효성 검사와 예외 처리 (0) | 2023.06.25 |
[스프링 부트] 09장. 연관관계 매핑 (0) | 2023.06.18 |
[스프링 부트] 08장. Spring Data JPA 활용 (0) | 2023.06.11 |
[스프링 부트] 06장. 데이터베이스 연동 (0) | 2023.06.04 |