
분명 4주차까지 기록했는데 벌써 7주차다.
내가 게을러서 건너뛴게 아니라 .. 5,6주차는 중간고사 때문에 쉬었다 ㅎㅎ
지난번에 JDBC를 이용한 방탈출 CRUD API까지 모두 완료해 스프링 입문을 수료하고 이번주부터는 인증, JPA, 배포를 포함한 스프링 기초 단계에 들어간다. 요번주는 인증 !
사실 나는 이제껏 여러 웹 프로젝트를 진행해오며 로그인 부분을 맡은 적이 한 번도 없다. 거의 기초만 아는 수준.. 그래서 이번주 일정은 더 알차고 유익할 것 같다 !
모든 서비스는 회원가입과 로그인 기능이 존재하고, 이를 바탕으로 사용자별 권한을 제한한다.
그런데 매번 권한을 확인할 때마다 아이디와 비밀번호를 요청하는 것은 번거로운 일이다.
따라서 처음 로그인할 때 받았던 아이디와 비밀번호를 서버에 저장해놓고 필요할 때마다 다른 정보와 함께 요청하는 것이 바람직하다.

기본적으로 요청을 보낼 때 Authorization Header에 아이디와 패스워드를 인코딩한 정보를 포함해서 보낼 수 있다. 이때 사진처럼 Autorization: Basic 이라는 형태로 요청 헤더에 정보를 실어 보낸다. 이 정보는 Base64 방식으로 암호화돼 정보를 쉽게 알아볼 수 없게 한다.
단 이 방식은 매 요청마다 아이디와 패스워드를 전송해 효율적이지 않다. 따라서 우리는 세션/토큰 기반 로그인을 구현할 것이다.
authorizationExtractor를 사용할 수 있다.
authorizationExtractor는 Http 요청에서 인증 토큰 또는 사용자 권한과 관련된 정보를 추출하는 데 사용된다.
extract() 메소드는 인증 정보에 필요한 정보들을 한꺼번에 추출할 수 있다. 특정 정보만 추출하고 싶다면 extractToken(),extractUser() 등을 사용할 수 있다.
인증 구현을 할 수 있는 두 가지 방법이다.

사용자 정보(아이디,비밀번호)를 처음 한 번 보내면 서버는 세션 저장소에 사용자 정보를 담아두고 이에 대한 식별값(Session ID)을 헤더에 담아 응답한다.
클라이언트는 이때 받은 식별값을 브라우저에 저장해놓고 서버에 다시 요청을 보낼 때마다 식별값을 헤더(쿠키)에 포함시켜 보낸다.
이 식별값으로 서버는 사용자를 식별하고 적절한 정보를 보낸다.
HttpSession를 사용할 수 있다.
저장할 정보를 setAttribute()로 저장하고 getAttribute()로 저장된 세션을 받아올 수 있다.

세션은 사용자 정보를 세션 저장소에 저장했다면 토큰은 클라이언트 저장공간에 보관된다. 서버는 이 정보를 검증해 암호화된 접근 토근인 JWT를 발급하여 응답한다. 세션과 마찬가지로 요청할 때마다 토큰을 헤더에 포함시켜 보내 서버에게 자신을 식별시킨다.
jwtTokenProvider로 토큰을 생성하고 HttpServletRequest로 사용할 수 있다.