티스토리 뷰
1. CORS 브라우저가 접속한 클라이언트의 서버와 서비스를 받는 백엔드 서버가 다를 경우 생기는 문제이다. 그래서 브라우저에서 URL을 붙이면 결과가 나오는데 React로 실행하면 CORS 에러가 뜬다. 가장 대표적인 증상이다.
2. CORS 설정이 제대로 되지 않는 이상, Authroization이나 cookie 데이터를 브라우저와 서버가 주고 받을 수 없다. 막힌다.
3. Authroization 정보와 cookie 정보를 보내고 싶으면
3-1 서버에서 Cross Origin 설정을 해주어야 한다.
3-1-1 첫번째로 allowCredentials 를 true로 설정해야 한다.
3-1-2 두번째로 origin에 허용할 클라이언트 서버 도메인을 입력해야 한다. 여기에 예전처럼 * 하면 브라우저가 막아버리기 때문에 * 하면 안된다.
3-1-3 쿠키를 허용하고 싶으면 쿠키 설정에서 sameStie를 none, secure를 true해 주어야 한다.
3-1-4 마지막으로 httpOnly 설정이 있는데, credential 정보 교환과는 상관없다.
3-1-4-1 이 부분은 보안을 강화하는 의미로 브라우저에서 JavaScript의 쿠키 읽기를 허용할지를 결정한다.
3-1-4-2 httpOnly가 true면 docuemnt.cookie를 찍어보면 아무것도 찍히지 않는다.
@RestController
@RequestMapping(
"/api/auth",
produces = [MediaType.APPLICATION_JSON_VALUE]
)
@CrossOrigin(
origins = [
"http://localhost:3000"
],
allowedHeaders = ["*"],
allowCredentials = "true"
)
class AuthController(
private val authService: AuthService
) {
private val log by LoggerDelegator()
@CrossOrigin
@PostMapping(value = ["/login", "/signin"])
fun login(
@RequestBody @Valid loginQuery: LoginQuery,
response: HttpServletResponse
): ResponseEntity<JwtAuthResponse> {
log.info("Log in attempt with ${loginQuery.email}")
val result = authService.login(loginQuery)
val jwt = ResponseCookie
.from("jwt", result.accessToken)
.httpOnly(false)
.maxAge(120)
.path("/")
.sameSite("None")
.secure(true)
.build().toString()
return ResponseEntity
.ok()
.header(HttpHeaders.SET_COOKIE, jwt)
.body(result)
}
3-2 클라이언트에서는 credential를 사용하여 전송하도록 설정해야 한다.
3-2-1 ajax 클라이언트는 다양하기 때문에 문서찾아보면 쉽게 나온다. 아래의 경우는 redux slice에서 설정한 내용인데, credentials가 include 되어 있다. axios는 withCredentials를 true로 설정해야 한다.
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
import { BASE_URL } from '../constants'
const baseQuery = fetchBaseQuery({
baseUrl: BASE_URL,
credentials: "include"
})
export const apiSlice = createApi({
baseQuery,
tagTypes: ['Product', 'Order', 'User'],
endpoints: (builder) => ({}),
});
const client = axios.create({
baseURL: server_url,
headers: {
"Content-Type": "application/json",
},
withCredentials: true
})
'Client Technologies > React' 카테고리의 다른 글
NextJs 구글 폰트 사용하기 (0) | 2024.03.26 |
---|---|
CORS: React 클라이언트가 Spring Cloud Gateway를 통과하지 못할 때 (0) | 2024.03.10 |
React : SCSS 사용하기 (0) | 2020.11.22 |
React : CSS 사용하기 (0) | 2020.11.22 |
React : React Modal 사용하기 (0) | 2020.11.16 |
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- 자바
- 외부파일
- 설정
- mapping
- jsp
- Spring
- crud
- form
- 설정하기
- 상속
- 로그인
- login
- XML
- Rest
- RestTemplate
- MYSQL
- one-to-many
- 하이버네이트
- WebMvc
- 매핑
- spring boot
- Angular
- Many-To-Many
- 스프링부트
- Validation
- Security
- 스프링
- one-to-one
- Spring Security
- hibernate