Spring Security(4)

별빛사막·2025년 1월 9일

만료된 accessToken을 연속적으로 요청하는 경우

apikey+EMPTY 또는 apikey+만료된 accessToken 요청 >> apikey+(갱신한)accessToken을 응답 헤더로 보내줌

  • 개발자가 postman으로 test할때는 여러번 해당 요청을 해도 된다.

ex.

apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1

  • but, 매 요청마다 키 재발급이 발생하므로 서버에 부하가 생기므로 클라이언트 측에서 아래 코드를 작성해줘야 잘못된 요청을 할때마다 apikey+(갱신한)accessToken을 응답 헤더를 보내지 않는다.
const response = await fetch("http://localhost:8080/api/v1/posts/1", {
    headers: {
        Authorization: `Bearer ${apiKey} ${accessToken}`
    }
});

if (response.headers.has('Authorization')) {
    const token = response.headers.get('Authorization').substring("Bearer ".length);
    accessToken = token.split(" ")[1];
}

코드개선 _ 쿠키

쿠키란?

: 헤더의 일종으로 여러개의 정보를 넣을 수 있다.
: 브라우저에서 동일한 요청에 대해서 관리하기 편하다
: 서버가 클라이언트에게 보내는 데이터로, 클라이언트는 이를 저장했다가 동일 서버에 재요청시 자동으로 전송한다.
: 기본적으로 키-값(key-value) 쌍으로 이루어진 데이터 구조이다.
: 응답(reponse)과 관련이 있다.

const response = await fetch("http://localhost:8080/api/v1/posts/1");
}

자동으로 Authorization을 헤더에 넣고, 만약 Authorization이 갱신되면 그걸 accessToken에 넣는 코드를 쿠키를 통해 해결할 수 있다.

일반 적인 헤더 vs 쿠키

구분Authorization 헤더 (일반 헤더)쿠키
처리 방식수동으로 처리해야 함자동으로 처리됨
관리 주체개발자가 직접 헤더에 추가하고 관리해야 함브라우저가 자동으로 관리
요청 포함매 요청마다 수동으로 포함시켜야 함모든 fetch 요청에 자동으로 포함
수정 반영-서버의 쿠키 수정 요청이 오면 자동으로 반영

과정( "쿠키를 굽는다"고 표현한다)

  • 쿠키를 한번 구워놓으면 이후 다른 요청 헤더에도 포함된다.
  • 응답(reposne)헤더에 apikey와 accessToken이 포함된다.
  1. 쿠키에 apikey와 accessToken 포함하기

  rq.setCookie("accessToken", accessToken);
  rq.setCookie("apiKey", member.getApiKey());

  //#rq.java
   public void setCookie(String name, String value) {
        ResponseCookie cookie = ResponseCookie.from(name, value)
                .path("/")  //보안설정 중 일부
                .domain("localhost")  //보안설정 중 일부
                .sameSite("Strict")  //보안설정 중 일부
                .secure(true)  //보안설정 중 일부
                .httpOnly(true)   //보안설정 중 일부
                .build();  //보안설정 중 일부

        resp.addHeader("Set-Cookie", cookie.toString());
    }
  1. (갱신된)accessToken의 경우도 Cookie에 저장되므로 따로 값을 넣어주지 않아도 된다.

브라우저 환경 - 쿠키에 인증 정보 저장
그 외(안드로이드, ios) 환경 - 헤더에 인증 정보 저장

왜 rq 클래스에 쿠키 로직을 작성했을까?

Rq 클래스는 컨트롤러 뿐 아니라 필터와 인터셉터에서도 사용될 수 있다.
: 왜냐하면 Rq가 RequestScope 객체이기 때문이다.
: HttpServletRequest와 HttpServletResponse 객체 관련된 로직이 컨트롤러, 필터, 인터셉터에 존재할 수 있는데 이를 Rq를 통해서 해당 중복들을 제거할 수 있다.

: HttpServletRequest와 HttpServletResponse 객체 관련된 로직을 포함한 상위 Controller를 만들고 이를 상속하여 사용한다면컨트롤러 수준에서의 중복만 제거할 수 있습니다.
→ 상속하여 사용하는 건 좋지 않은 방법이다.

RequestScope 객체의 생명주기?

Controller간에 공유해야하는 것들은 rq.java 클래스에 작성하면 좋다.
@RequestScope 생명주기에 의해 관리되므로 Controller 외에 Filter 등에서도 작동된다.

profile
조금씩 매일 성장하자

0개의 댓글