로그인은 간단하게 ID, PW를 확인하고 OK 해주면 될것같지만 생각보다 처리해주어야할부분이 많다.큰산 하나인 토큰을 발급하는부분은 이전에 다루었으니 제외하고 설명해보겠다. AuthController@Slf4j@RequestMapping("/auth")@RestController@RequiredArgsConstructorpublic class AuthController { private final JwtProvider jwtProvider; private final AuthService authService; /** * 로그인 * * @return 멤버 리스트 * GET /auth/login */ @ExcludeAuth @PostMapping..
지난시간에 Jwt Token을 쿠키로 발급해주었다. 해당 로직으로 토큰을 발급해주고나면 유효시간 이후에는 만료되어 사용할 수 없다.그런데 이 토큰의 만료시간이 짧으면, 사용자가 로그인을 너무 자주 해야하는 문제가 있고,기간이 길면 Token을 갈취해서 악용될 여지가 있다. 이런 단점을 보완하기 위해서 Refresh Token이라는 개념이 사용된다. Access Token을 짧게, Refresh Token을 길게 기간을 지정하고,Access Token이 만료되었을때 Refresh Token이 유효하면 Token을 다시 발급한다.서비스에 따라서 노란부분(Refresh 유효, Access 만료)에서 로직을 선택할 수 있다.A. Access 토큰만 재발급한다 : 최초 로그인부터 Refresh 토큰의 유효기간이 ..
쿠키 검증로직까지 만들었다면 한가지 난감한 상황이 생긴다. 로그인을 할때도 토큰검증을 해버린다는것..Interceptor는 별다른 처리가 없을때는 전체 API를 대상으로 동작하기 때문에 이런경우는 제외시켜주어야 한다. 이를 Custom Annotation으로 해결해보겠다. ExcludeAuth/* 인증예외 어노테이션 생성 (AuthIntercepter에서 예외처리) */@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface ExcludeAuth {}ExcludeAuth라는 이름의 annotation을 만들어줬다. TokenAuthInterceptor@Slf4j@Componentpublic class TokenAuthI..
지난시간엔 Jwt Token을 발급해보았다. 그렇다면 실제 API를 던졌을때 Token을 확인하고 실제 유저인지 판별해보는 로직을 만들어보겠다. CookieParser@Slf4jpublic class CookieParser { /** * 쿠키에서 특정 key값을 가진 value를 가져온다. * @param cookies 쿠키에 담긴 key,value 목록 * @param key key * @return value or exception */ public static String getCookieValue(Cookie[] cookies, String key) { try (Stream stream = Arrays.stream(cookies)) { return stream.filter(cooki..
데이터를 다루는 API를 누구나 어디에서나 자유롭게 호출해서 쓸수 있다면 보안적으로 큰 문제가 되시겠다. 이를 막을수 있는방법은 여러가지가 있는데 클라이언트의 서버를 제한하거나( CORS 정책 ), 진입 사용자를 판별( 세션, 쿠키 ) 하는 방법등이 있다. 이글에서 다루어볼 방법은 Jwt Token으로 암호화된 유저정보를 쿠키에 저장해서 API 진입시마다 확인하는 방법이다. 준비과정1. 유저 정보로 판별하려면 이미 유저데이터를 가지고있어야 한다. 고로 DB연결 및 유저정보는 테이블에 이미 들어있어야한다.참고 : https://debugggggger.tistory.com/30 Spring 프로젝트 시작하기 - DB 연결(JPA)프로젝트에 JPA로 Mysql DB를 연결해볼것이다.1. build.gradle..
API는 동작중 여러 오류사항을 마주할 수 있다.오류가 발생했을때 클라이언트쪽에서 에러를 판별하고 적절한 처리를 할 수 있도록 예외를 리턴해주어야한다. 우선 boot-starter-web가 없다면 의존성을 추가해준다.dependencies { implementation 'org.springframework.boot:spring-boot-starter-web'} 1. Response 규정@JsonFormat(shape = JsonFormat.Shape.OBJECT)public enum ServerResponse { SUCCESS(HttpStatus.OK, "OK", HttpStatus.OK.getReasonPhrase()) , INVALID_TOKEN(HttpStatus.UNAUTHORIZED,..