| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- IntelliJ
- 문자열
- 배열
- Eclipse
- CSS
- java테스트
- math
- 단위테스트
- js
- junit
- 이클립스
- json
- Visual Studio Code
- vscode
- HashMap
- 자바스크립트
- 자바문법
- 자바
- 정규식
- Array
- input
- javascript
- ArrayList
- 테스트자동화
- string
- junit5
- list
- html
- 인텔리제이
- Java
- Today
- Total
목록IT/SpringBoot (30)
어제 오늘 내일
드디어 Spring Security + JWT 시리즈의 마지막입니다! 👏지금까지 우리는 설정(Config), 필터(Filter), 토큰 발급기(Provider), 로그인 로직(Service)을 각각 조각조각 구현했습니다.오늘은 이 조각들이 실제로 합쳐져서 어떻게 동작하는지,---1. 로그인 할 때(토큰 발급)2. API를 호출할 때(토큰 사용)---두 가지 흐름으로 나누어 시퀀스 다이어그램으로 정리해 보겠습니다. 1. 전체 흐름도 (Sequence Diagram) 2. 다이어그램 상세 분석위 그림을 Flow 1 (로그인)과 Flow 2 (API 요청)로 나누어 자세히 뜯어보겠습니다.📌 [Flow 1] 로그인 & 토큰 발급 (여권 만들기)사용자가 처음 들어와서 ID/PW를 입력하고 "출입증(JWT)"을..
지난 시간까지 보안 설정(Config)을 바꾸고, 필터(Filter)를 장착했습니다.하지만 기존의 Form Login을 삭제했기 때문에, 현재는 로그인도 회원가입도 할 수 없는 상태입니다.이번 마지막 시간에는 사용자가 JSON으로 아이디/비번을 보내면 토큰을 발급해 주는 API 컨트롤러를 만들고,Postman으로 전체 흐름을 테스트하며 대장정을 마무리하겠습니다.Step 1. 로그인 요청용 DTO 만들기로그인할 때 받을 데이터(ID, PW)를 담을 객체입니다.위치: src/main/java/com/example/board/dto/MemberLoginDto.javapackage com.example.board.dto;import lombok.Data;@Datapublic class MemberLoginDto..
지난 시간까지 JWT 토큰 발급기(JwtTokenProvider)를 만들었습니다.이제 스프링 시큐리티 설정을 뜯어고쳐서 세션 기반의 Form Login을 걷어내고, JWT 필터를 장착할 차례입니다.이 과정이 끝나면 기존의 로그인 화면은 동작하지 않게 되며, 완전히 새로운 방식(API)으로 로그인을 처리하게 됩니다.우리는 이제 세션 기반의 "페이지 이동식 로그인"을 버리고, REST API 방식(데이터만 주고받는 방식)으로 전환합니다.더 이상 서버가 "로그인 페이지를 띄워주고, 로그인 성공하면 메인으로 튕겨주는" 역할을 하지 않습니다.서버는 오직 "ID/PW를 주면 토큰을 던져주는" 역할만 합니다.Step 1. JwtAuthenticationFilter 만들기 (보안 검색대)먼저, 요청이 들어올 때마다 헤..
지난 6편(이론편)에서 JWT는 "서버가 발급해 주는 위조 불가능한 출입증"이라고 배웠습니다.이제부터 실전입니다!기존 세션 방식을 버리고 JWT 방식을 적용하기 위해 가장 먼저 해야 할 일은'출입증을 찍어내는 기계(Provider)'를 만드는 것입니다.이 클래스 하나만 잘 만들어두면, 로그인할 때 토큰을 만들고, 요청이 올 때 토큰을 검사하는 모든 곳에서 핵심 부품으로 사용됩니다.Step 1. 의존성 추가 (build.gradle)JWT 기능을 구현하려면 외부 라이브러리가 필요합니다. Java 진영에서 가장 널리 쓰이는 jjwt 라이브러리를 추가합니다.파일: build.gradledependencies { // ... 기존 의존성 ... // JWT 라이브러리 (0.11.5 버전 사용) ..
지금까지 우리는 "세션(Session) 기반"의 로그인을 구현했습니다.사용자가 로그인하면 서버(Tomcat)의 메모리에 "이 사람 로그인했음!"이라고 적어두고,브라우저에게는 JSESSIONID라는 입장권을 줬죠.하지만 요즘 트렌드인 React, Vue, 모바일 앱(Android/iOS)과 통신하려면 세션 방식은 한계가 있습니다.그래서 등장한 것이 JWT(JSON Web Token)입니다.코드를 짜기 전에, "도대체 JWT가 뭐고, 세션이랑 뭐가 다른지" 명확히 짚고 넘어가는 이론편을 준비했습니다.(이걸 모르면 코드를 짜도 이해가 안 됩니다!)두 방식의 차이점을 '헬스장 이용'에 비유해서 아주 쉽게 설명해 드립니다.1. 세션(Session) 인증 방식 (우리가 지금까지 한 것)비유: "회원님 얼굴 기억해 ..
지금까지는 서버가 켜질 때 자동으로 생성되는 admin 계정만 사용했습니다.이번 5편에서는 사용자가 직접 아이디와 비밀번호를 입력해 가입하고, 그 비밀번호를 안전하게 암호화하여 DB에 저장하는 기능을 구현합니다.특히 마지막에는 DB를 직접 조회해서 비밀번호가 정말 암호화되었는지 확인해보겠습니다.Step 1. SecurityConfig 수정 (H2 Console 허용)나중에 DB에 데이터가 잘 들어갔는지 확인하려면 H2 Console(localhost:8080/h2-console)에 접속해야 합니다. 하지만 시큐리티는 기본적으로 이 경로도 막아버립니다.접속을 허용하고, 화면이 깨지지 않도록 설정을 추가하겠습니다.위치: src/main/java/com/example/board/config/SecurityCo..
네, 3편까지 잘 따라오셨습니다!이제 기능은 다 갖췄으니 "사용자에게 보이는 화면"을 다듬을 차례입니다.개발자인 우리 눈에는 기본 로그인 화면도 나쁘지 않지만, 실제 서비스라면 우리 서비스만의 디자인이 적용된 로그인 페이지가 필수겠죠?이번 4편에서는 Thymeleaf와 Bootstrap을 이용해 예쁜 로그인 화면을 만들고, 로그인 상태에 따라 버튼이 바뀌는(로그인 vs 로그아웃) 기능을 구현해 보겠습니다.Step 1. 로그인 화면 만들기 (login.html)먼저 templates 폴더에 로그인 HTML 파일을 만듭니다.여기서 가장 중요한 건 태그의 name 속성입니다. 시큐리티는 기본적으로 username과 password라는 이름을 찾기 때문입니다.위치: src/main/resources/templ..
지난 시간까지 시큐리티를 설치하고 비밀번호 암호화 설정을 마쳤습니다.하지만 아직 로그인을 할 수 없었죠?시큐리티가 우리 DB에 어떤 회원이 있는지 모르기 때문입니다.이번 시간에는 시큐리티와 내 DB를 연결해 주는 핵심 인터페이스인 UserDetailsService를 구현해 보겠습니다.Step 1. SecurityConfig 수정 (로그인 폼 활성화)가장 먼저 지난 시간에 작성했던 설정 파일(SecurityConfig)을 수정해야 합니다.Spring Boot 3.x부터는 명시적으로 설정을 안 하면 로그인 화면 자체가 안 뜨고 403 에러가 발생합니다.위치: src/main/java/com/example/board/config/SecurityConfig.javapackage com.example.board...
개념은 잡았으니 이제 진짜 코드를 만져봅시다.Spring Security를 프로젝트에 추가하는 순간, 마법처럼 모든 페이지가 잠기게 됩니다.이번 포스팅에서는 라이브러리 추가, 설정 클래스(SecurityConfig) 만들기, 그리고 비밀번호 암호화(BCrypt)까지 진행합니다.Step 1. 의존성 추가 (build.gradle)가장 먼저 build.gradle에 시큐리티 의존성을 추가합니다.dependencies { // ... 기존 의존성 ... implementation 'org.springframework.boot:spring-boot-starter-security'}(추가 후 코끼리 아이콘(Load Gradle Changes) 클릭 필수!) 🖐 잠깐! 무슨 일이 일어난 거죠?의존성만 ..
스프링을 공부하는 많은 분들이 "가장 큰 통곡의 벽"으로 꼽는 것이 바로 Spring Security입니다.설정할 것도 많고, 용어도 어렵죠 (Principal? GrantedAuthority? FilterChain?).하지만 한 번 이해하고 나면 이만큼 든든한 보디가드도 없습니다.오늘은 복잡한 코드를 짜기 전에, Spring Security가 왜 필요하고 어떻게 작동하는지 아주 쉽게 개념부터 잡아보겠습니다.1. Spring Security, 왜 쓸까?만약 시큐리티 없이 우리가 직접 로그인과 권한 체크를 구현한다면 어떻게 될까요?아마 모든 Controller 메소드마다 이런 코드를 넣어야 할 겁니다.// 시큐리티가 없다면... (끔찍한 상황)@GetMapping("/admin/members")public..
