[포스코x코딩온] 풀스택 부트캠프 4차 프로젝트 -6
api 어드레스를 작성하면서 한 가지 의문이 들었다.
일단 프론트와 연동을 안해놔서 그런가 그동안 별 생각 없었는데
내가 짠 api에서 클라이언트 측은 내가 이 사용자라는 것을 증명하기 위해서 userIndex 또는 userid를 보내야 한다.
이게 만약 세션에서는 그냥 세션에 있는 userid 정보를 이용하면 된다.
하지만 restAPI에서는 계속 정보를 줘야한다. 게다가 어떤건 index, 어떤건 id를 줘야해서 조금 헷갈릴 것 같았다.
다만 이와 똑같이 모든 요청마다 userid가 담겨있는 정보를 보내는 곳이 존재한다. 그건 accessToken이다.
access token에는 마침 subject에 userid가 담겨있기도 하다. 유저 정보가 필요한 모든 요청에 access token을 디코딩해서 이용한다. 그렇게 된다면 클라이언트는 유저아이디나 유저 인덱스를 담지 않아도 본인에 대한 증명을 할 수 있을거다.
그래서 Authorization 헤더에 있는 accessToken에 담긴 userid를 추출하고 이를 통해서 userIndex를 찾아올 수 있는 함수를 만들어서 적용하고 유저 정보가 필요한 모든 controller에 적용함으로써 해결할 수 있었다.
또한 원래는 access token의 signiture에 넣는 key를 서버가 재시작하면 바뀌게 함으로써 보안에 조금 신경쓰려고 했는데, 현재 스프링 서버와 파이썬 서버가 소통하는 과정에서도 access token이 필요하기 때문에 고정된 access token(유효기간이 긴)이 필요하다는 말이 있었다.
근데 어차피 그 요청은 시작점이 클라이언트니까 그 클라이언트가 보낸 헤더에 있는 토큰을 그대로 다시 헤더에 실어 보내면 안되나?? 라는 생각이 들었지만 그냥 하기로 했다.
(근데 이 경로만 토큰 없어도 되게 해도 되는거 아닌가 싶지만 그건 보안이 아예 없기 때문에 위험하다고 생각했다.)
일단 유효기간이 상대적으로 긴 access token을 만드는 데는 성공했는데 고정된 signiture, 즉 key를 이용하려면 env 파일에 따로 secret key를 등록하면 된다는 생각까지 갔고, env파일 변수 설정은 어렵지 않기 때문에 설정했다.
하지만 여기서 @Value로 주입한 env 값을 읽지 못하고 계속 null 값을 가져오는 사건이 발생했다.
아래 사진에 있는 getBytes() 메소드가 계속해서 null pointer exception을 일으킬 거라는 밑줄이 그어져있었다.
그래서 구글링을 해보니까 이 클래스가 @Autowired가 아닌 new 생성자 함수로 생성이 된다면 bean에 등록되지 않은 함수이기 때문에 Spring context가 인식하지 못하고 autowired를 못해주기 때문에 null 값이 들어온다는 글을 보게 되었다.
보니까 이 service를 필드로 받는 JwtRequestFilter가 new로 생성되어 있었다.
그래서 new로 되어있는 부분을 생성자 주입으로 바꾸어주었다.
하지만 실패했다.
그래서 이참에 모든 필드를 생성자 주입으로 바꿔주었다.
https://green-bin.tistory.com/53
Spring - @Value가 계속 null을 가져올 때 원인과 해결 방법
@Value란? DB 접속 정보나 비밀번호와 같이 민감한 정보를 별도의 파일로 분리해서 환경 정보에 맞는 값을 불러오도록 하는 애너테이션이다. application.properties 또는 application.yml에 값을 설정하면 필
green-bin.tistory.com
아래 블로그를 참조하여 컴포넌트가 스캔이 안되어서 그런가 하고 시험도 해봤는데 그것도 아니었다.
Spring @Value Injection Error 해결 방법/ @Value 값이 주입되지 않아서 null로 뜨는 경우
@Value Injection이 되지 않아서 null로 뜨는 문제를 해결하는 방법입니다😃
velog.io
계속 헤매던 중 내가 지금까지 쓰던 방식과 다른 점이 하나 있었다.
바로 메소드 안에서 전역변수를 이용한다는 사실이었다.
혹시나 해서 메소드 안에 넣으니까 사라졌다.
조금 허무한 결과이긴 하지만, 주입된 @Value 값이 함수 외부에서 new로 생성된다면 null값을 불러온다는 사실을 알게 되었으니까 그걸로 만족한다.