diff --git a/JeongBean.md b/JeongBean.md new file mode 100644 index 0000000..debe39d --- /dev/null +++ b/JeongBean.md @@ -0,0 +1,72 @@ +#**사용자 관점에서의 로그인 과정 흐름** + +##Q1.사용자가 로그인 페이지에 접속하여 ID와 비밀번호를 입력하는 순간부터 로그인에 성공하고 실패하는 순간까지의 과정을 설명하세요. (2경우 전부) +1.사용자가 로그인 페이지에 접속하여 ID와 비밀번호를 입력하여 로그인 버튼을 클릭합니다. +-클라이언트가 주소 /api/members/login에 로그인 정보를 post 합니다. +-findByLoginId에서 아이디가 존재하는지 조회합니다. +-아이디가 존재한다면 validationPassword로 입력한 비밀번호와 저장 되어있는 암호화된 비밀번호를 비교합니다. + +###로그인 성공 +2.회원정보가 있는 사용자는 로그인에 성공합니다. 웹사이트에서 제공하는 서비스를 이용합니다. +-아이디와 비밀번호 모두 기존에 저장 되어있는 정보와 일치한다면 로그인에 성공합니다. +-로그인 성공 후에 세션이 생성됩니다. + +###로그인 실패 +3.회원정보가 없는 사용자는 로그인에 실패합니다. 사용자는 아이디와 비밀번호를 다시 입력하여 로그인을 시도 해야합니다. +-findByLoginId에서 아이디가 존재하지 않는다면 "회원 정보를 찾을 수 없습니다." 를 반환합니다. +-validationPassword에서 비밀번호가 일치하지 않는다면 "비밀번호가 일치하지 않습니다." 를 반환합니다. + +##Q2.로그인 성공 후 사용자에게 제공되는 경험을 설명하고, 특히 '로그인 유지'가 어떻게 사용자 관점에서 나타나는지 서술하세요. +1.로그인 성공 후 사용자는 해당 웹사이트에서 제공하는 다양한 서비스를(정보 조회, 게시물 작성 ...) 이용할 수 있습니다. +2.다른 페이지로 이동해도 로그인 상태는 유지됩니다. +3.브라우저를 닫았다가 다시 열어도 로그인 상태가 유지되는 경우도 있습니다.(세션 ID가 쿠키에 저장된 경우, 쿠키가 만료되지 않은 경우) + +--- + +#**서버가 로그인한 사용자를 인식하는 방식** + +##Q1.로그인한 사용자를 서버가 지속적으로 인식하기 위해 쿠키와 세션이 어떻게 사용되는지 설명하세요. (서버 딴에서 api 호출할 때마다 어떤 일이 일어나는지.) +HTTP는 요청과 응답 사이의 연결이 끝나면 상태를 기억하지 않으므로, 로그인 상태와 같은 사용자 정보를 유지하려면 세션과 쿠키가 필요합니다. +로그인 성공 후에 해당 웹사이트에서 마이페이지를 들어가려고 서버에 요청해도 서버는 동일 사용자라는 것을 알지 못합니다. +그렇기 때문에 사용자가 사이트에 로그인한 상태라는 것을 서버에게 지속적으로 인증해야 로그인 상태를 유지할 수 있습니다. +이를 해결하기 위해 사용하는 것이 세션과 쿠키입니다. + +세션은 서버 측에서 사용자의 상태 정보를 저장해두는 메모리 공간입니다. 세션은 서버에서 사용자의 로그인 상태와 인증 정보를 저장합니다. +세션이 새로 생성되면 서버는 고유한 세션 ID를 자동으로 생성합니다. 이 세션 ID는 서버에서 클라이언트에게 쿠키로 전송합니다. +세션 ID를 받은 클라이언트는 쿠키로 저장하고, 서버에 요청시 세션 ID를 활용하여 로그인 상태를 유지하게 됩니다. + +###로그인 후 인증 정보 관리 과정 +1.로그인 시 서버는 기존의 세션을 가져오거나, 새로 세션을 생성합니다. +2.사용자 인증 정보를 저장하기 위해 Authentication 객체를 생성하고, UsernamePasswordAuthenticationToken 형식으로 사용자 인증 정보(아이디,비밀번호,권한)를 저장합니다. +3.SecurityContext에 Authentication 객체를 저장하여 인증 정보를 설정하고, SecurityContextHolder를 통해 중앙에서 접근할 수 있습니다. +4.서버는 SecurityContext를 세션에 `"SPRING_SECURITY_CONTEXT"`라는 이름으로 저장하고, 세션 ID를 클라이언트로 전송합니다. +5.클라이언트는 쿠키에 세션 ID를 저장하며, 이후 요청 시마다 쿠키에 포함된 세션 ID를 서버로 전달하여 로그인 상태를 유지합니다. + + +##Q2.쿠키가 세션 기반 로그인에서 어떤 역할을 하는지 구체적으로 서술하고, 특히 세션 ID가 쿠키에 저장되어 클라이언트와 서버 간에 전달되는 과정에 대해 설명하세요. +쿠키란 서버가 클라이언트에 저장하는 데이터입니다. 쿠키는 세션 ID를 저장해서 클라이언트가 서버에 요청할때 인증 상태를 유지할 수 있도록 사용됩니다. +1.세션이 생성되고 고유한 세션 ID가 자동으로 생성됩니다. +2.세션 ID는 클라이언트에 쿠키로 전달되어 저장됩니다. +3.클라이언트가 요청을 보낼 때 쿠키에 저장된 세션 ID와 함께 전송됩니다. +4.서버는 세션 ID를 받아서 세션에서 인증 정보를 확인하여 요청을 처리합니다. + +--- + +#**세션을 구현할 때 보안적으로 고려해야할 부분이 뭐가 있을까요? (5주차 코드에는 생략되어 있음) 찾아보시기 바랍니다.** +1.CSRF 방지 +CSRF(Cross-Site Request Forgery)는 유효한 상태의 사용자 세션을 공격자가 악의적으로 대신 요청을 하는 공격입니다. +이는 사용자가 의도하지 않은 비밀번호 변경, 결제 요청 등이 발생할 수 있습니다. +-CSRF 토큰 사용 : 서버는 CSRF 토큰을 클라이언트에게 제공하고, 클라이언트는 요청시 CSRF 토큰을 전송하여 사용자를 판별할 수 있습니다. +-SameSite 설정 : 쿠키가 동일한 사이트에서만 주고받을 수 있도록 설정합니다. + +2.세션 타임아웃 설정 +세션 타임아웃을 설정하지 않지 않은 상태에서 로그아웃을 하지 않고 종료했을 경우 다른 사용자가 사용할 수 있는 위험성이 있습니다. +-서버에서 세션 타임아웃 시간을 설정합니다. 서버가 일정 시간 동안 사용자의 요청이 없으면 자동으로 세션을 만료시키도록 설정합니다. + +3.세션 고정 공격 방지 +의도된 세션 ID를 사용자가 로그인하면 공격자가 사용자 계정에 접근하는 공격입니다. +-사용자가 로그인할 때마다 새로운 세션 ID를 생성합니다. 그리고 이전 세션 ID는 폐기합니다. + +4.HTTPS 적용 +세션 하이재킹과 같은 공격자가 사용자의 세션 ID를 탈취하는 위험을 방지하기 위해서 HTTPS를 적용해야합니다. +-HTTPS를 사용하면 클라이언트와 서버 간의 통신이 암호화되어 중간자 공격을 방지할 수 있습니다.