Spring

day65 TIL

dalooong 2023. 7. 25. 15:39

스프링 시큐리티 복습

참고 230706 스프링 시큐리티 auth 프로젝트, 0707 JWT, 0710 Filter, 0711 OAuth2

 

스프링 시큐리티 목적 : 

  • 회원가입, 로그인, 로그아웃 등 
  • 서비스에는 사용자라는 개념이 존재한다.
  • 인증(Authentication) : 사용자가 자신이 누구인지를 증명하는 과정
  • 권한(Authorization)  : 사용자가 어떤 작업을 수행할 수 있는지를 결정하는 과정 

순서 

1. 스프링생성 시 스프링 시큐리티 넣어서 생성하기 

2. 인증 필요 설정 RootController 

WebSecurityConfig 빈 객체 반환 메소드 정의

.authorizeHttpRequests() 첫번째 메소드 설정 

3.하나의 requestMathers에 어떤 방식(예) authenticated, annoymous 등) 으로 할 지 하나씩 넣는 것임

 

4. 스프링 시큐리티만 추가해줘도 기본 로그인 페이지가 나온다. 

기본설정을 하면 기본 로그인 페이지 사라짐 

 

Form Login

✅ 로그인 : 가장 기본적인 사용자 인증 방식 

  1. 사용자가 로그인 페이지로 이동
  2. 서버는 사용자를 로그인 페이지로 이동
  3. 사용자는 로그인페이지를 통해 아이디와 비밀번호 전달(form 양식 사용, input, input,... )각각 아이디 네모, 비밀번호 네모 
  4. 아이디와 비밀번호 확인 후 사용자를 인식

이후 쿠키를 이용해 방금 로그인한 사용자를 세션을 이용해 기억한다. 

로그인 실패했다 ("아이디와 비밀번호를 확인하시오")라는 문구를 추가할 수 있다.

로그인 구현하기 

  1. 로그인을 하기 위한 엔드포인트를 정의하는 UserController 생성 (@slf4j, @controller, @requestmapping("users") 등 사용)
  2. 로그인 페이지를 보여주기 위한 /login,  로그인한 사용자가 자신의 정보를 확인하기 위한 /my-profile 생성
  3.  

0707 복습 

jpa와 sqlite를 이용해서 사용했다 

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.xerial:sqlite-jdbc:3.41.2.2'
runtimeOnly 'org.hibernate.orm:hibernate-community-dialects:6.2.4.Final'
spring:
  datasource:
    url: jdbc:sqlite:db.sqlite
    driver-class-name: org.sqlite.JDBC
    username: sa
    password: password

  jpa:
    hibernate:
      ddl-auto: create
    database: h2
    database-platform: org.hibernate.community.dialect.SQLiteDialect
    show-sql: true

userentity에는 내가 넣고 싶은 사용자 정보 목록 만들기 

Long id, string username, string password, string email, string phone 등등

 

💡 UserEntity와 UserDetails 차이점

  • userentity : jpa 엔티티 즉 데이터베이스 연결되어있는 엔티티를 나타내기 위한 것
  • userdetails : 스프링 시큐리티가 서로 필요한 기능들을 사용하기 위한 객체임 Userentity에 userdatials는 분리하는 게 좋다 (관심사 분리 안나누고하면 entity에 기능이 너무 많이 지기 때문에 , entity에는 내가 넣고 싶은 기능, datails는 좀 더 간단하게)

JWT 복습 JSON Web Token 

header.payload.signature

헤더 

페이로드.

시그니처 총 3부분으로 나뉨 

 

기능

  • 사용자 확인을 위한 인증 정보
  • 위변조 확인이 용이 -> 위변조가 어려움
  • 토큰 기반 인증 시스템에서 많이 활용

토큰을 사용하면 더 이상 서버에서 세션을 관리하지 않아도됨 세션을 저장하지 않고 토큰의 소유를 통해 인증 판단

  • 상태를 저장하지 않기 때문에 서버 세션 관리 불필요
  • 토큰 소유가 곧 인증임 -> 여러 서버에 걸쳐서 인증이 가능 
  • 쿠키는 요청을 보낸 클라이언트에 종속되지만, 토큰은 쉽게 첨부가 가능함 (주로 헤더에서 첨부)

jwt 는 암호화 과정이 필요하므로 @value 어노테이션을 통해서 yaml에 jwt: secret: afdggljgfjl~~~ 입력해서 사용하면 된다. 

JJWT 라이브러리 

implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

apllication-prod.yaml 을 하나더 만들어서 토큰값이나 암호등을 따로 관리 할 수 있음 (깃에는 토근이나 암호가 올라가면 안된다 ) 

 

0710 스프링 시큐리티와 필터

 

0711 OAuth2 

참고 15_oauth 프로젝트 

open Authorization 

  • 다른 서비스의 사용자 정보를 안전하게 위임받기 위한 표준
  • 로그인을 대신 해주는 기술이 아니다
  • 사용자가 어떤 서비스에 소셜 로그인을 진행하고 싶을 때 해당 서비스에 직접 인증, 정보를 주지 않아도 나의 정보를 조회할 수 있도록 권한을 위임하는 기술이다 

네이버 아이디 로그인 (네이버, 카카오, 구글 등)