apikey+EMPTY 또는 apikey+만료된 accessToken 요청 >> apikey+(갱신한)accessToken을 응답 헤더로 보내줌
ex.
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
apikey+""+(잘못된)accessToken1
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에 넣는 코드를 쿠키를 통해 해결할 수 있다.
| 구분 | Authorization 헤더 (일반 헤더) | 쿠키 |
|---|---|---|
| 처리 방식 | 수동으로 처리해야 함 | 자동으로 처리됨 |
| 관리 주체 | 개발자가 직접 헤더에 추가하고 관리해야 함 | 브라우저가 자동으로 관리 |
| 요청 포함 | 매 요청마다 수동으로 포함시켜야 함 | 모든 fetch 요청에 자동으로 포함 |
| 수정 반영 | - | 서버의 쿠키 수정 요청이 오면 자동으로 반영 |
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());
}
브라우저 환경 - 쿠키에 인증 정보 저장
그 외(안드로이드, ios) 환경 - 헤더에 인증 정보 저장
Rq 클래스는 컨트롤러 뿐 아니라 필터와 인터셉터에서도 사용될 수 있다.
: 왜냐하면 Rq가 RequestScope 객체이기 때문이다.
: HttpServletRequest와 HttpServletResponse 객체 관련된 로직이 컨트롤러, 필터, 인터셉터에 존재할 수 있는데 이를 Rq를 통해서 해당 중복들을 제거할 수 있다.
: HttpServletRequest와 HttpServletResponse 객체 관련된 로직을 포함한 상위 Controller를 만들고 이를 상속하여 사용한다면컨트롤러 수준에서의 중복만 제거할 수 있습니다.
→ 상속하여 사용하는 건 좋지 않은 방법이다.
Controller간에 공유해야하는 것들은 rq.java 클래스에 작성하면 좋다.
@RequestScope 생명주기에 의해 관리되므로 Controller 외에 Filter 등에서도 작동된다.