
1.API 서버를 위한 구성
- CSR(Client Side Rendering) 방식이 점차 사용됨
- API 서버 : 클라이언트가 원하는 데이터를 제공하는 서버
즉, 순수하게 원하는 데이터만 제공하는 서버
- Controller에서 @RestController 사용
2. API 서버를 위한 필터
- 외부에서 API 호출시 주로 '인증 정보' or '인증 키(key≈token)'를 같이 전송해 처리
- 외부에서 특정 API 호출시 반드시 인증에 사용할 토큰을 같이 전송
- 서버에서는 이 토큰을 검증
1) OncePerRequestFilter
.addFilterBefore(선행 필터, 이후 필터) - 해당 메서드로 필터 동작 순서 변경 가능
3. API를 위한 인증처리
- ApiLoginFilter
- 특정한 URL로 외부에서 로그인 가능하도록 함
- 로그인 성공 시 Authorization(인가) 헤더 값으로 이용할 데이터 전송
public class ApiLoginFilter AbstractAuthenticationProcessingFilter{
...
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
...
}
}
- AbstractAuthenticationProcessingFilter
- 추상 메서드
- attempAuthentication() 추상 메서드와 문자열로 패턴을 받는 생성자 필요
- SecurityConfig 클래스에 추가
- AbstractAuthenticationProcessingFilter는 AuthenticationManager 객체 반드시 필요
1. Authorization 헤더 처리
Authorization, 클라이언트에서 전송한 Request에 포함된 Authorization 헤더 값 파악해 정상 요청 여부 판단
2. AuthenticationManager 이용해 인증 처리
- AuthenticationManager, ApiLoginFilter 정상적으로 동작하기 위해 내부적으로 동작
- authenticate() 메서드를 지니며 파라미터와 리턴 타입이 동일
authentication(Authentication authentication)
- authentication 타입의 객체는 'xxxToken' 사용
인증 실패 처리
ApiLoginFilter 직접 인증 이후 Success or Failure 처리
1. 메서드 override 사용해 처리
1. 인증 실패, JSON 결과 전송 되도록 수정
2. 인증 성공, 클라이언트가 보관할 인증 토큰 전송
2. 별도의 클래스 지정
인증 성공 처리
- AbstractAuthenticationProcessingFilter - @override successfulAuthentication()
- successfulAuthentication(Authentication authResult)
- Authentication, 인증 성공한 사용자 인증 정보 포함
JWT 토큰 생성 ・ 검증
-
JWT
- 인증 성공한 사용자에게 JWT 전송
- API 호출시 해당 Request 정상 요청인지 확인하는 용도로 사용
Header.Paylod.Signature
- Header, 토큰 타입과 알고리즘 의미 (HS256 or RSA)
- Payload, 이름(name)과 값(value) 쌍을 Claim이라 하며 이를 모아둔 객체를 의미
- Signature, 헤더의 인코딩 값과 정보의 인코딩 값을 더해 비밀 키로 해시 함수화한 결과
JWT 용도
- 인증 성공시 JWT 문자열 만들어 클라이언트에 전송
- 클라이언트가 보낸 토큰 값 검증
implementation 'io.jsonwebtoken:jjwt:0.9.1'
implementation 'javax.xml.bind:jaxb-api:2.3.0'
- JWTUtil 클래스
- generateToken(String cotent) - 토큰 생성
- validateAndExtract(String tokenStr) - 유효 시간 및 검증
- Filter에 JWT 적용
- 생성과 검증에 문제 없으면 ApiLoginFilter/ApiCheckFilter에 적용
- ApiLoginFilter는 JWTUtil 생성자에 주입