Redux-react-session을 이용시, 사용자 인증(로그인, 토큰 관리)을 라이브러리를 통해 하게 된다.
내 경우는 로그인 처리시에 완료 후, axios (RESTful API for React) 에 default header를 세팅하게 된다. AngularJS를 사용할 때 $resource를 사용하던 버릇이랄까.
export function signinUser(headers, callback) {
return function(dispatch) {
axios.get(`login`, {headers})
.then(response => {
const {token, userinfo} = response.data
setHeaders(token)
// 세션 처리 결과 처리
})
.catch(error => {
dispatch(authError(error.response.data.err))
})
}
}
export function setHeaders(token){
axios.defaults.headers.common[AUTH_TOKEN] = token
axios.defaults.headers.post[AUTH_TOKEN] = token
axios.defaults.headers.get[AUTH_TOKEN] = token
axios.defaults.headers.delete[AUTH_TOKEN] = token
}
뭐 대충 위와 같은 식으로..
그런데 이렇게 default header를 세팅해두더라도, 새로고침하면 다시 없어진다. 음, 분명 LocalStorage에 저장되어 있는 것을 확인했는데도 말이다.
이유인 즉, 결국 새로고침시에 최상단 부모에서 최소 1회의 action호출을 통해 다시금 sessionService.loadSession() 을 해서 axios의 기본 헤더를 채워줘야 한다.
나의 경우는 App.js 가 최상단(index.js제외) 컴포넌트라서 이곳의 componentDidMount() 에서 아래와 같이 처리했다.
// App.js
class App extends Component {
componentDidMount() {
this.props.initialize()
}
render() {
//중략
}
}
// InitAction.js
export function initialize() {
return function(dispatch) {
sessionService.loadSession()
.then(token => {
setHeaders(token)
})
}
}
function setHeaders(token){
axios.defaults.headers.common[AUTH_TOKEN] = token
axios.defaults.headers.post[AUTH_TOKEN] = token
axios.defaults.headers.get[AUTH_TOKEN] = token
axios.defaults.headers.delete[AUTH_TOKEN] = token
}
생각보다 간단하다. 리엑트에서는 Top-down방식임을 잊지 않도록 노력해야 할듯.. 최소 initialize() 액션을 둬서, 이곳에서 초기값으로 불러와야 하는 것들을 잘 정해줘야 하는게 관건이 될 것 같다. 🙂



