[TIL] 2022.12.06

rara_kim·2022년 12월 6일
0

TIL

목록 보기
24/25

며칠간의 이야기

며칠간 개인과제를 진행하느라 정신없이 보냈다.
강의를 듣으면서도 이해가 안가서 몇번씩 같은 내용을 반복하고 같은 코드를 여러번 쳐보면서 공부했다.
이번엔 인증,인가의 개념을 익히고과 JWT를 이용한 회원가입, 로그인 기능을 구현해야 했는데, 생각보다도 훨씬 더 어려웠던 것 같다.
코드가 길고 복잡해지고, 개념이 어려워지다보니 막막했는데 어찌어찌 예정대로 과제를 끝마칠 수 있었다.
코드를 작성하면서도 이게 맞는지 제대로 하고 있는건지 모르는 것 투성이지만, 일단은 문제없이 프로그램이 실행되고 시나리오 대로 기대값이 나왔으니, 제출 기한까지는 모르는 내용에 대해 공부하고 차근차근 코드를 수정해보려고 한다.
(필수는 아니지만 Lv2 난이도의 과제도 있으나 무리하지 않고 부족한 개념공부를 하기로 마음 먹었다.)



인증, 인가

인증(Authentication)

해당 유저가 실제 유저인지 인증하는 개념이다.
스마트폰에 지문인식, 이용하는 사이트에 로그인 하는 것과 같이, 실제 그 유저가 맞는지를 확인하는 절차이다.

인가(Authorization)

해당 유저가 특정 리소스에 접근이 가능한지 허가를 확인하는 개념이다.
예를 들어, 관리자 페이지-관리자 권한 같은 것들을 들 수 있다.

쿠키-세션 방식의 인증

쿠키-세션 방식은 서버가 특정 유저가 로그인 되었다는 상태를 저장하는 방식이다.
인증과 관련된 아주 약간의 정보만 서버가 가지고 있게 되고 유저의 이전 상태의 전부는 아니더라도
인증과 관련된 최소한의 정보는 저장해서 로그인을 유지시킨다는 개념이다.

쿠키-세션 방식의 과정

  1. 사용자가 로그인 요청을 보낸다.
  2. 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조하여 사용자를 확인한다.
  3. 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 “세션 저장소”에 해당 유저가 로그인 되었다는 정보를 넣는다.
  4. 세션 저장소에서는 유저의 정보와는 관련 없는 난수인 session-id를 발급한다.
  5. 서버는 로그인 요청의 응답으로 session-id를 건네준다.
  6. 클라이언트는 그 session-id를 쿠키라는 저장소에 보관하고 앞으로의 요청마다 세션아이디를 같이 보낸다. (주로 HTTP header에 담는다.)
  7. 클라이언트의 요청에서 쿠키를 발견했다면 서버는 세션 저장소에서 쿠키를 검증한다.
  8. 유저 정보(세션)을 획득한다.(정보를 받아왔다면 로그인이 되어있는 사용자일 것 이다.)
  9. 이후에는 로그인 된 유저에 따른 응답을 내어준다.

JWT 기반 인증

JWT(JSON Web Token)란 인증에 필요한 정보들을 암호화시킨 토큰을 의미한다.
JWT 기반 인증은 쿠키/세션 방식과 유사하게 JWT 토큰(Access Token)을 HTTP 헤더에 실어 서버가 클라이언트를 식별한다.

실제로 위와 같이 생겼고 .를 사용하여 세 부분으로 나뉘어져 있다.
알고리즘에 의해 암호화된 토큰을 해독하면 아래와 같은 모습이다.

가운데에 실제 유저의 정보가 들어있고, HEADER와 VERIFY SIGNATURE부분은 암호화 관련된 정보 양식이라고 생각하면 된다.

JWT 방식의 과정

  1. 사용자가 로그인 요청을 보낸다.
  2. 서버는 DB의 유저 테이블을 뒤져서 아이디 비밀번호를 대조해서 사용자를 확인한다.
  3. 실제 유저테이블의 정보와 일치한다면 인증을 통과한 것으로 보고 유저의 정보를 JWT로 암호화해서 내보낸다.
  4. 서버는 로그인 요청의 응답으로 jwt 토큰을 건네준다.
  5. 클라이언트는 그 토큰을 저장소에 보관하고 앞으로의 요청마다 토큰을 같이 보낸다.
  6. 클라이언트의 요청에서 토큰을 발견했다면 서버는 토큰을 검증한다.
  7. 이후에는 로그인 된 유저에 따른 응답을 내어준다.

JPA: save() vs saveAndFlush()

save()

이름에서도 알 수 있듯이, save() 메소드는 엔티티를 DB에 저장하는 기능을 수행한다.
save() 메소드는 Spring Data 에서 정의한 CrudRepository 인터페이스의 메소드이다.

save() 메소드는 바로 DB에 저장되지 않고 영속성 컨텍스트에 저장되었다가 flush() 또는 commit() 수행 시 DB에 저장된다.


saveAndFlush()

save() 메소드와는 다르게 saveAndFlush() 메소드는 실행중(트랜잭션)에 즉시 data를 flush() 한다.
saveAndFlush() 메소드는 Spring Data JPA 에서 정의한 JpaRepository 인터페이스의 메소드이다.

saveAndFlush() 메소드는 save() 메소드와 달리, 즉시 DB에 변경사항을 적용하는 방식이다.


profile
느리더라도 꾸준하게

0개의 댓글